本套JAVA8教程由于是有英文翻譯過來的,如果有翻譯不對的地方還請多多包涵。
本節(jié)課先簡單的介紹下Java8有哪些新特性,對于Java6/7版本做出哪些更改.那廢話不多說,趕緊開始今天的課程吧.
經(jīng)過下面的小打小鬧終于迎來了一個重要的方法 FlatMap,當前方法與map函數(shù)不同.具體看下區(qū)別吧
在Java 8中,Stream可以包含不同的數(shù)據(jù)類型,例如:
Stream<String[]>
Stream<Set<String>>
Stream<List<String>>
Stream<List<Object>>
但是,Stream操作(filter,sum,distinct ...)和收集器不支持它,因此,我們需要flatMap()來執(zhí)行以下轉換
{ {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函數(shù)可以變?yōu)長ist<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實戰(zhàn)");
obj1.addBook("Spring Boot實戰(zhàn)");
Student obj2 = new Student();
obj2.setName("李白");
obj2.addBook("Python實戰(zhàn)");
obj2.addBook("java8實戰(zhàn)");
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實戰(zhàn)
Java8實戰(zhàn)
Python實戰(zhàn)
以上代碼.distinct() 函數(shù)為去重,其實同collect(Collectors.toSet())一樣效果