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