Contenu connexe
Similaire à Java8 stream (20)
Java8 stream
- 8. Stream 的使用方式
long sum = LongStream
.range(0, N)
.map(i -> i * i)
.filter(i -> i % 2 == 0)
.sum();
•建立 Stream
- 9. Stream 的使用方式
long sum = LongStream
.range(0, N)
.map(i -> i * i)
.filter(i -> i % 2 == 0)
.sum();
•透過連續的 intermediate operation 操作
- 10. Stream 的使用方式
long sum = LongStream
.range(0, N)
.map(i -> i * i)
.filter(i -> i % 2 == 0)
.sum();
•最後用 terminal operation 結束
- 16. Terminal Operation
•不會回傳 stream,整個 stream 只能有一個
terminal operation 呼叫
•呼叫後才會開始走查 stream,最後產生並回
傳結果或是製造 side-effect
•呼叫完 terminal operation 後 stream 會被
當作被使用完畢
•Stream -> (Intermediate)* -> Terminal
- 18. •toArray
•max
•sum ( Primitive Stream )
•average ( Primitive Stream )
stream.toArray(String[]::new);
stream.max(String::compareTo);
intStream.sum();
intStream.average();
- 20. <U> U reduce(
U identity,
BiFunction<U, ? super T, U >
accumulator,
BinaryOperator<U> combiner);
Stream<T>#reduce
•accumulator 和 combiner 每次處理完元素
後,必須回傳新的值
- 21. Integer result = stream.reduce(0,
(sum, b) -> sum + b.getWeight(),
Integer::sum);
Stream<T>#reduce
- 25. <R> R collect(
Supplier<R> supplier,
BiConsumer<R,? super T>
accumulator,
BiConsumer<R,R> combiner);
Stream<T>#collect
•accumulator 和 combiner 都是 consumer
- 28. •所以 Collectors 提供了許多預設的方法提供
常用的 Collector
•toList, groupingBy, toSet, toMap,
counting
stream.collect(Collectors.toList());
stream.collect(Collectors
.groupingBy(…));
strStream.collect(Collectors
.join(","));
- 31. !
List<Item> items = new ArrayList<>…;
Map<String, List<Item>> result =
items.stream().collect(groupingBy(
Item::getOwner));
!
>> {owner1=[i1, i2], owner2=[i3],…}
- 32. !
List<Item> items = new ArrayList<>…;
Map<String, Set<String>> result =
items.stream().collect(groupingBy(
Item::getOwner,
toSet()));
>> {owner1=[i1], owner2=[i3], …}
- 33. List<Item> items = new ArrayList<>…;
Map<String, Set<String>> result =
items.stream().collect(groupingBy(
Item::getOwner,
mapping(Item::getName(),
toSet())));
!
>> {owner1=[name1], owner2=[name2],…}
- 34. Lazy Evaluation
List<Integer> items =
Arrays.asList(1, 2, 3, 4);
items.stream()
.filter( i -> { sout("A"+i); i % 2 == 0; })
.map( i -> { sout("B"+i); return i; })
.map( i -> { sout("C"+i); return i; });
•不會印出東西
- 35. Lazy Evaluation
List<Integer> items =
Arrays.asList(1, 2, 3, 4);
items.stream()
.filter( i -> { sout("A"+i); i % 2 == 0; })
.map( i -> { sout("B"+i); return i; })
.map( i -> { sout("C"+i); return i; })
.collect(toList());
- 36. Lazy Evaluation
List<Integer> items =
Arrays.asList(1, 2, 3, 4);
items.stream()
.filter( i -> { sout("A"+i); i % 2 == 0; })
.map( i -> { sout("B"+i); return i; })
.map( i -> { sout("C"+i); return i; })
.collect(toList());
>> A1, A2, B2, C2, A3, A4, B4, C4
- 37. Parallel
List<Integer> items =
Arrays.asList(1, 2, 3, 4);
items.parallelStream()
.filter( i ->
{ sout("A"+i); return i % 2 == 0; })
.map( i -> { sout("B"+i); return i; })
.map( i -> { sout("C"+i); return i; })
.collect(toList());
>> A1, A3, A4, A2, B4, B2, C2, C4
- 40. Example 1
•找出第一個 age > 20 的 Student
for (Student student : students) {
if (student.age > 20) {
return student;
}
}
}
- 43. List<String> result = …;
for (Student student : students) {
if (student.age > 20 && student.grade > 90) {
result.add(student.id);
if(result.size() >= 10){
break;
}
}
}
- 44. List<String> result = students.stream()
.filter(student -> student.age > 20)
.filter(student -> student.grade > 90)
.limit(10)
.map(student -> student.id)
.collect(Collectors.toList());
- 46. List<Category> result = …;
for (Category category : categories) {
for (Article a : c.getArticles()) {
if (a.getCommentCount() >= 20) {
result.add(c);
break;
}
}
}
Collections.sort(result,
Comparator.comparing(c -> c.getName()));
- 52. ArrayList<String> results = new
ArrayList<>();
stream.filter(…)
.forEach(s -> results.add(s));
List<String>results = stream
.filter(…)
.collect(Collectors.toList());
Side Effects
- 53. Set<Integer> seen =
Collections.synchronizedSet(
new HashSet<>());
stream.parallel().map(e -> {
if (seen.add(e)) return 0;
else return e;
})...
Stateless Behaviors
- 54. List<String> source = ...;
source.stream()
.filter(s -> {
source.add(...);
return s.length() > 10;
})
...
Non-inferences
•走查過程中不該動到來源資料結構
•除非該資料結構是支援 concurrent 存取