Advanced   Java   Services Streams bearbeiten und terminieren Back Next Up Home


Streams bearbeiten und terminieren


ObjectStream -> List

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]

ObjectStream -> Array

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 -> Array

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

IntStream -> List

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());

Endlose Streams mit generate()
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

Endlose Streams mit iterate()

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

map() Beispiele

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





xxx






Valid XHTML 1.0 Strict top Back Next Up Home