Java >> Java tutorial >  >> Tag >> break

Java 8 anvender funktion til alle elementer i Stream uden at bryde stream-kæden

Der er (mindst) 3 måder. For eksempelkodens skyld har jeg antaget, at du vil kalde 2 forbrugermetoder methodA og methodB :

A. Brug peek() :

list.stream().peek(x -> methodA(x)).forEach(x -> methodB(x));

Selvom dokumenterne siger, at du kun bruger det til "debug", virker det (og det er i produktion lige nu)

B. Brug map() for at kalde metode A, så returner elementet tilbage til strømmen:

list.stream().map(x -> {method1(x); return x;}).forEach(x -> methodB(x));

Dette er nok den mest "acceptable" tilgang.

C. Gør to ting i forEach() :

list.stream().forEach(x -> {method1(x); methodB(x);});

Dette er det mindst fleksible og passer muligvis ikke til dit behov.


Du leder efter Stream 's map() funktion.

eksempel:

List<String> strings = stream
.map(Object::toString)
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);

Den bedste mulighed, du har, er at anvende kortet på din stream. som returnerer en strøm, der består af resultaterne af at anvende den givne funktion på elementerne i strømmen. For eksempel:

IntStream.range(1, 100)
           .boxed()
           .map(item->item+3)
           .map(item->item*2)... 

Vi anvender flere ændringer af strømmen, men i nogle tilfælde ønsker vi ikke at ændre strømmen. Vi vil bare besøge hvert element og derefter sende det ned i strømmen uden ændringer (som peek()-metoden i streams API). i sådanne tilfælde kan vi

StreamItem peekyMethod(StreamItem streamItemX) {
   // .... visit the streamItemX
   //Then pass it down the stream
   return streamItemX;
}

Java tag