Bu tür görevlerle uğraşmanın en genel yolu, çoklu toplayıcıların sonuçlarını tek bir şekilde birleştirmektir. jOOL kütüphaneyi kullanma
, aşağıdakilere sahip olabilir:
Content content =
Seq.seq(contentList)
.collect(
Collectors.mapping(Content::getA, Collectors.joining(", ")),
Collectors.mapping(Content::getB, Collectors.joining(", ")),
Collectors.mapping(Content::getC, Collectors.joining(", "))
).map(Content::new);
Bu giriş listesinden bir Seq
oluşturur ve 3 değerleri için bir tutucu basitçe olan bir Tuple3
oluşturmak için 3 verilen koleksiyoncuları bir araya getirir. Bu 3 değer daha sonra new Content(a, b, c)
yapıcı kullanılarak Content
içine eşlenir. Koleksiyoner, her Content
'u a
, b
veya c
değerine eşleştiriyor ve sonuçları bir ", "
ile birbiriyle birleştiriyor.
üçüncü taraf yardımı olmadan, biz (bu 2 koleksiyoncular için aynı şeyi yapar StreamExpairing
kollektör, temel alır) böyle kendi birleştirici kollektörü oluşturabilir. 3 toplayıcıyı argüman olarak alır ve toplanan 3 değerin sonunda bir son işlemci işlemi gerçekleştirir.
public interface TriFunction<T, U, V, R> {
R apply(T t, U u, V v);
}
public static <T, A1, A2, A3, R1, R2, R3, R> Collector<T, ?, R> combining(Collector<? super T, A1, R1> c1, Collector<? super T, A2, R2> c2, Collector<? super T, A3, R3> c3, TriFunction<? super R1, ? super R2, ? super R3, ? extends R> finisher) {
final class Box<A, B, C> {
A a; B b; C c;
Box(A a, B b, C c) {
this.a = a;
this.b = b;
this.c = c;
}
}
EnumSet<Characteristics> c = EnumSet.noneOf(Characteristics.class);
c.addAll(c1.characteristics());
c.retainAll(c2.characteristics());
c.retainAll(c3.characteristics());
c.remove(Characteristics.IDENTITY_FINISH);
return Collector.of(
() -> new Box<>(c1.supplier().get(), c2.supplier().get(), c3.supplier().get()),
(acc, v) -> {
c1.accumulator().accept(acc.a, v);
c2.accumulator().accept(acc.b, v);
c3.accumulator().accept(acc.c, v);
},
(acc1, acc2) -> {
acc1.a = c1.combiner().apply(acc1.a, acc2.a);
acc1.b = c2.combiner().apply(acc1.b, acc2.b);
acc1.c = c3.combiner().apply(acc1.c, acc2.c);
return acc1;
},
acc -> finisher.apply(c1.finisher().apply(acc.a), c2.finisher().apply(acc.b), c3.finisher().apply(acc.c)),
c.toArray(new Characteristics[c.size()])
);
}
ve son olarak
Content content = contentList.stream().collect(combining(
Collectors.mapping(Content::getA, Collectors.joining(", ")),
Collectors.mapping(Content::getB, Collectors.joining(", ")),
Collectors.mapping(Content::getC, Collectors.joining(", ")),
Content::new
));
İyi sorun bilgi ile kullanabilirsiniz. Ama şimdi, ne denedin? StackOverflow, başkalarının sizin için kod yazmasını sağlayan bir topluluk değildir. Bunun yerine, ne denediğinizi, neye sahip olduğunuzu ve neyi beklediğinizi gösteren bir [mcve] göndermeniz gerekir ve StackOverflow topluluğu, yanlış gittiğiniz yerleri belirlemeye ve çözümleri belirlemeye yardımcı olabilir. – AJNeufeld
@AJNeufeld öneri için teşekkürler. Bu aynı zamanda, her gün kullanıyorum ama SO üzerinde bir soru göndermeye çalışıyorum. İçeriği eklemek için bir değişken ile temel bir döngü ile çalışıyorum. Ve stream üzerinde forEach kullanmayı denedim sonra Java anonim fonksiyonların foreach bloğu içinde değişken değiştirmeye izin vermediğini fark etti. Ayrıca, bir ulaşmak için bir koleksiyon yazmayı düşündüm, ama bunun da verimli olmayacağını fark ettim. – Vedanth