Advanced Java Services | Streams bearbeiten und terminieren |
Für ObjectStreams geht das mit der Hilfsklasse Collectors sehr einfach:
Stream<String> stringStream = Stream.of("fgh", "nbv", "ret", "gfd", "mnx", "dsf", "qwe", "poi","cde", "bxw"); List<String> stringList = stringStream.map( s --> s.substring(0,2) ).collect(Collectors.toList()); System.out.println(stringList);
Ausgabe
[fg, nb, re, gf, mn, ds, qw, po, cd, bx]
Vor der terminalen Operation wird map() und sorted() eingesetzt
Stream<String> stringStream = Stream.of("fgh", "nbv", "ret", "gfd", "mnx", "dsf", "qwe", "poi","cde", "bxw"); String[] stringArr = stringStream.map( String::toUpperCase ).sorted().toArray( String[]::new); Arrays.stream(stringArr).forEach(s -> System.out.print(s+" ")); System.out.println();
Ausgabe
BXW CDE DSF FGH GFD MNX NBV POI QWE RET
Man kann sich die Ergebnisse auch unterwegs mit peek() ausgeben lassen.
Stream<String> stringStream2 = Stream.of("fgh", "nbv", "ret", "gfd", "mnx", "dsf", "qwe", "poi","cde", "bxw"); String[] stringArr2 = stringStream2.map( String::toUpperCase ).sorted().peek(s -> System.out.print(s+" ")).toArray( String[]::new);
IntStream intStream = IntStream.of(1, 2, 3, 3, 5, 6, 7, 8, 9, 10, 11); int[] squares = intStream.map( i -> i*i ).peek( i -> System.out.print(i + " ") ).toArray();
Ausgabe
1 4 9 9 25 36 49 64 81 100 121
Da eine Liste von Objekten aufgebaut werden muß, ist ein wenmig mehr Aufwand notwendig. Es werden mehrer Lösungen gezeigt. Am einfachsten geht es mit der intermediären Operation boxed()
IntStream intStream1 = IntStream.of(0, 1, 1, 2, 3, 5, 8, 13, 21, 34); List<Integer> intList = intStream1.boxed().collect( Collectors.toList());
Die zweite Lösung verwendet die Methode mapToObj()
IntStream intStream2 = IntStream.of(0, 1, 1, 2, 3, 5, 8, 13, 21, 34); List<Integer> intList2 = intStream2.mapToObj(Integer::new).collect(Collectors.toList());
Random rd = new Random(); // effectively final // Endloser Stream von Lottozahlen IntStream.generate( () -> 1 + rd.nextInt(49) ).forEach(System.out::println) ;
Ausgabe
. . 13 5 18 44 28 32 9 17 49 45 35 . .
Mit der Methode limit() kann man den Stream begrenzen.
IntStream.generate( () -> 1 + rd.nextInt(49) ).limit(6).forEach(System.out::println);
Ausgabe
24 44 42 33 22 36
Intstream
// iterate(int seed, IntUnaryOperator f) IntStream.iterate(0, i -> 2*i ).forEach( i -> System.out.print(i + " ") ); // Unendliche Folge von Potenzen von 2 // 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 ... // Startwert = 1 : // 1, 1 -> 2*1 , 2 -> 2*2, 4 -> 2*4, 8 -> 2*8 // Startwert = a // a, a -> f(a) = b, b -> f(f(a)), usw.
limitiert
IntStream.iterate(1, i -> 2*i ).limit(11).forEach( i -> System.out.print(i + " ") );
Ausgabe
1 2 4 8 16 32 64 128 256 512 1024
Objectstream
Stream.iterate("", s -> s + "ab").limit(7).forEach(System.out::println);
Ausgabe
ab abab ababab abababab ababababab abababababab
Mehrwertsteuer zu Nettobeträgen addieren
List<Double> netto = Arrays.asList(123.0, 234.0, 345.0, 456.0, 567.0); List<Double> brutto = netto.stream().map( x -> Math.rint(119*x)/100 ).collect(Collectors.toList()); brutto.stream().forEach(System.out::println);
Aus einem Stream von Strings Elemente rausfiltern und in einen Stream von StringBuilder abbilden.
Die Zeichenketten umdrehen und ausgeben.
Stream<String> stringStream = Stream.of("fgh", "nbv", "ret", "gfd", "mnx", "dsf", "qwe", "poi", "cde", "bxf"); Stream<StringBuilder> sBuilderStream = stringStream.filter( s -> s.contains("f")).map( StringBuilder::new ); sBuilderStream.map( sb -> sb.reverse()).forEach(System.out::println);
Eine Liste der G7-Staaten streamen, in Großschrift umwandeln und in einen String schreiben, in dem die einzelnen Namen durch Komma getrennt sind.
List<String> g7 = Arrays.asList("USA", "Japan", "France", "Germany", "Italy", "U.K.","Canada"); String g7Countries = g7.stream().map(x -> x.toUpperCase()).collect(Collectors.joining(", ")); System.out.println(g7Countries); // USA, JAPAN, FRANCE, GERMANY, ITALY, U.K., CANADA