本套JAVA8教程由于是有英文翻译过来的,如果有翻译不对的地方还请多多包涵。
本节课先简单的介绍下Java8有哪些新特性,对于Java6/7版本做出哪些更改.那废话不多说,赶紧开始今天的课程吧.
经过下面的小打小闹终于迎来了一个重要的方法 FlatMap
,当前方法与map
函数不同.具体看下区别吧
在Java 8中,Stream可以包含不同的数据类型,例如:
Stream<String[]>
Stream<Set<String>>
Stream<List<String>>
Stream<List<Object>>
但是,Stream操作(filter,sum,distinct ...)和收集器不支持它,因此,我们需要flatMap()来执行以下转换
{ {1,2}, {3,4}, {5,6} } -> flatMap -> {1,2,3,4,5,6}
{ {'a','b'}, {'c','d'}, {'e','f'} } -> flatMap -> {'a','b','c','d','e','f'}
当前用大白话解释下, List<List<String>> 通过flatMap函数可以变为List<String>. 这样说是不是通俗一点呢
Stream + String[] + flatMap
下面的示例将打印一个空结果,因为filter()不知道如何过滤String []流。
public static void main(String[] args) {
String[][] data = new String[][]{{"a", "b"}, {"c", "d"}, {"e", "f"}};
//Stream<String[]>
Stream<String[]> temp = Arrays.stream(data);
//filter a stream of string[], and return a string[]?
Stream<String[]> stream = temp.filter(x -> "a".equals(Arrays.toString(x)));
stream.forEach(System.out::println);
}
输出
空
在上面的例子中,我们应该使用flatMap()将Stream <String []>转换为Stream <String>
public static void main(String[] args) {
String[][] data = new String[][]{{"a", "b"}, {"c", "d"}, {"e", "f"}};
//Stream<String[]>
Stream<String[]> temp = Arrays.stream(data);
//Stream<String>!
Stream<String> stringStream = temp.flatMap(Arrays::stream);
Stream<String> stream = stringStream.filter("a"::equals);
stream.forEach(System.out::println);
/*stream = Arrays.stream(data)
.flatMap(Arrays::stream)
.filter("a"::equals);*/
}
输出
a
Stream + Set + flatMap
先实例一个Student
对象
@Data
public class Student {
private String name;
private Set<String> book;
}
下面逻辑有两个学生,我想得到两个学生下所有的书籍,怎么做呢?
public static void main(String[] args) {
Student obj1 = new Student();
obj1.setName("PrimaryKey");
obj1.addBook("Java8实战");
obj1.addBook("Spring Boot实战");
Student obj2 = new Student();
obj2.setName("李白");
obj2.addBook("Python实战");
obj2.addBook("java8实战");
List<Student> list = new ArrayList<>();
list.add(obj1);
list.add(obj2);
List<String> collect = list.stream()
.map(Student::getBook) //Stream<Set<String>>
.flatMap(Collection::stream) //Stream<String>
.distinct()
.collect(Collectors.toList());
collect.forEach(System.out::println);
}
输出
Spring Boot实战
Java8实战
Python实战
以上代码.distinct()
函数为去重,其实同collect(Collectors.toSet())一样效果
网友评论