Java Stream API
Java Streams
Java在JDK1.8中引入了Stream API,支持对流的处理。流处理类似于对于数据库数据流进行只读操作后求得某种结果,有如下特点:

- stream不存储数据
 - stream不改变源数据
 - stream的延迟执行特性
 
Stream API 简述
创建Stream
Stream.of(Collection
1  | //Stream.of()  | 
Stream操作
Reference Link: https://www.cnblogs.com/CarpenterLee/p/6545321.html
| 操作类型 | 接口方法 | 
|---|---|
| 中间操作 | concat() distinct() filter() flatMap() limit() map() peek() skip() sorted() parallel() sequential() unordered() | 
| 结束操作 | allMatch() anyMatch() collect() count() findAny() findFirst() forEach() forEachOrdered() max() min() noneMatch() reduce() toArray() | 
对于接口方法的传入参数,是各种函数接口,可以用lamda表达式方便的书写。下面介绍几个经典的API使用:
- forEach()
 
forEach(Consumer<? super E> action)
1  | // 使用Stream.forEach()迭代  | 
- filter()
 
filter(Predicate<? super E> predicate)
1  | // 保留长度等于3的字符串  | 
- map()
 
1  | Stream<String> stream = Stream.of("I", "love", "you", "too");  | 
- reduce()
 
reference Link: http://www.cnblogs.com/CarpenterLee/p/6550212.html
- Optional
reduce(BinaryOperator accumulator)  - T reduce(T identity, BinaryOperator
accumulator)  - <U> U reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)
 
1  | // 找出最长的单词  | 
- collect()
 
R collect(Supplier supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner) - <R,A> R collect(Collector<? super T,A,R> collector)
 
1  | // 将Stream规约成List  | 
LINQ in C#
与Java语言相比,C#引入了LINQ,lamda表达式和扩展方法来更好的支持chaining operation。LinQ支持所有实现了Enumberable接口的类型。
ForEach()
.ForEach(Action
action) 
1  | List<string> stringList = new List<string>();  | 
Where()
.Where(Func<T, bool> function)
1  | stringList.Where( x=> x.Length == 3)  | 
Select()
.Select(Func<T, int, R> function)
1  | stringList.Selct((x, i) => x.ToUpper())  | 
Aggregate()
.Aggregate(A, Func<A, T, A> function, Func<A, R> function2)
1  | stringList.Aggregate("", (cur, next) => cur.Length > next.Length ? cur : next, x => Console.WriteLine(x));  | 
- 扩展方法,Java collect()方法是.NET扩展方法功能的一种实现,C#通过定义扩展方法更好的支持LINQ的Chaining功能,使得Java Collectors的接口都可以直接通过相似的方法实现。
 
1  | stringList.Select(x=>x).toList();  |