Java 8常用的流操作

以下都是我从《java 8函数式编程》看到的,
collect(toList())
collect(toList())方法是由stream里面的值生成的一个列表,是一个及早求值的操作。
List<Integer> list = Stream.of(1,2,3,4,5,).collect(Collectors.toList());

assertEquals(Arrays.asList(1,2,3,,4,5),List);
上面 程序讲述的是从Stream中生成一个列表。很多Stream操作都是惰性求值,因此调用Stream上一个系列的方法之后,还需要最后调用一个类似collect的及早求值方法。

map
假设函数可以将一种类型的值转换成另外一种类型,map操作就可以使用该函数,将流中的值转换成一个新的流,如map将字符串转换为大写形式
List<String> collect = Stream.of("a","b","hello").map(String->string.toUpperCase()).collect(toList());

assertEqual(asList("A","B","HELLO"),collect);
传给map的Lambda表达式只接受一个String类型的参数,返回一个新的string。参数和返回值不必属于同一种类型,但是lambda表达式必须是Function接口的一个实例。

filter
遍历数据并检查其中的元素时,可尝试使用stream提供新的方法
以往我们都是循环遍历列表,使用条件语句做判断。这可以被称为filter模式。
List<String> beginningWithNumbers = Stream.of("a","1abc","abc1").filter(value->isDigit(value.charAt(0)))
.collect(toList());
filter也是接受一个函数作为参数,该函数用Lambda表达式表示。

flatMap
flatMap方法可以用Stream替换值,然后将多个Stream连接成一个Stream。Map操作是用一个新的值代替Stream中的值。但是,用户希望让map操作有点不一样,生成一个新的Stream对象来替换。用户不希望结果是一连串的流,此时flatMap最能派上用场。
List<Integer> together = Stream.of(asList(1,2),asList(3,4)).flatMap(number ->numbers.stream()).collect(toList());
assertEquals(asList(1,2,3,4),together);
调用stream方法,将每个列表转换成stream对象,其余部分由flatMap方法处理。flatMap方法的相关函数接口和map的方法一样,都是Functio接口,只是方法的返回值限定为Stream类型。

max和min
Stream上常用的操作之一就是求最大值和最小值。Stream API中的max和min操作足以解决这一问题。
Stream查找最短曲目
List<Track> tracks = asList(new Track("Bakai",524),
new Track("Violets for Your Furs",378),
new Track("Time Was",451));

Track shortestTrack = track.stream().min((Comparator.comparing(track ->track.getLength())).get();

assertEquals(tracks.get(1),shortestTrack);
查找Stream中的最大或最小元素,首先考虑排序的指标。为了让Stream对象按照曲目长度进行排序,需要传给他一个comparator对象。java8 提供一个新的静态方法compaing,使用它可以方便地实现一个比较器。

上一篇:C#List排序


下一篇:C# 随机列表