Ich dachte darüber nach, wie ich mit von JavaBeans erstellten Objekten in einer Methodenkette umgehen soll.
Ich weiß nicht, ob es sich um die genaue Spezifikation handelt, aber die allgemeinen JavaBeans-Spezifikationen lauten wie folgt.
Es gibt viele andere Dinge, aber das Wichtigste ist dieses. Klicken Sie hier für offizielle Spezifikationen → Java Beans Spec
HogeBean.java
public class HogeBean {
private String name;
private String id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
So was. Mit Lombok
HogeBean.java
@Data
public class HogeBean {
private String name;
private String id;
}
Das ist in Ordnung.
Angenommen, Sie haben eine HogeBean und eine FugaBean mit ähnlichen Feldern.
HogeBean.java
@Data
public class HogeBean {
private String name;
private String id;
}
FugaBean.java
@Data
public class FugaBean {
private String id;
private String password;
}
Wenn Sie HogeBean in Stream in FugaBean konvertieren möchten, denken Sie normal
List<HogeBean> hoges = ...
hoges.stream().map(hoge -> {
FugaBean fuga = new FugaBean();
fuga.setId(hoge.getId());
return fuga;
}).Beendigung
Ich werde nur so schreiben. Es ist nicht so schön.
Es mag nicht sehr schön sein, aber die mittlere Klammer + Rückkehr in der Karte ist ein Muster, das verhindert werden kann.
hoges.stream().map(hoge -> new FugaBean(){
{
setId(hoge.getId());
}
}).Beendigung
Es ist viel sauberer als zuvor. Aber es gibt Nachteile
Die Option zum Beenden von JavaBeans. Ändern Sie den Setter wie folgt.
FugaBean.java
public HogeBean setId(String id) {
this.id = id;
return this;
}
Fügen Sie für lombok einfach Accessors hinzu (chain = true)
FugaBean.java
@Data
@Accessors(chain = true)
Die Bearbeitung der Angelegenheit kann wie folgt erfolgen
hoges.stream().map(hoge -> new FugaBean().setId(hoge.getId())).Beendigung
Erfrischend. Aber es gibt doch Nachteile,
So was
BeanCreater.java
public final class BeanCreater<T> {
private BeanCreater() {
}
private T bean;
public static <T> BeanCreater<T> of(Supplier<T> supplier) {
BeanCreater<T> builder = new BeanCreater<T>();
builder.bean = supplier.get();
return builder;
}
public BeanCreater<T> construct(Consumer<T> consumer) {
consumer.accept(this.bean);
return this;
}
public T build() {
return this.bean;
}
}
Mit diesem,
hoges.stream().map(hoge -> BeanCreater.of(FugaBean::new)
.construct(bean -> bean.setId(hoge.getId())).build()).Beendigung
Hmm. Ich habe es versucht, aber es ist nicht gut genug. Der Code ist zu laut.
Persönlich mag ich Lösung 2 am meisten. Es hat eine fließende Schnittstelle und es gibt keine Verschwendung im Wesentlichen und zeremonielle Gespräche. Ich hoffe, dass JavaBeans angesichts der aktuellen Situation flexibler wird. (Ich glaube nicht, dass das der Fall ist ...) Klicken Sie hier, um den diesmal erstellten BeanCreater anzuzeigen: https://github.com/7tsuno/BeanCreater
Bitte geben Sie an, wenn Sie weitere Ideen haben!
Recommended Posts