本套JAVA8教程由于是有英文翻譯過來的,如果有翻譯不對(duì)的地方還請(qǐng)多多包涵。
本節(jié)課先簡單的介紹下Java8有哪些新特性,對(duì)于Java6/7版本做出哪些更改.那廢話不多說,趕緊開始今天的課程吧.
在這篇教程中我將向你展示 filter(), collect(), findAny() 和 orElse() 的用法
Streams 中 filter() 和 collect() 函數(shù)的用法
在 Java 8 以前, 我們會(huì)像下面這樣過濾一個(gè) List:
public static void main(String[] args) {
List<String> lines = Arrays.asList("spring", "hibernate", "neo4j");
List<String> result = getFilterOutput(lines, "neo4j");
for (String temp : result) {
System.out.println(temp);
}
}
private static List<String> getFilterOutput(List<String> lines, String filter) {
List<String> result = new ArrayList<>();
for (String line : lines) {
if (!filter.equals(line)) {
result.add(line);
}
}
return result;
}
以上代碼大致意思就是創(chuàng)建了一個(gè)list容器,里面存放了spring,hibernate,neo4j三個(gè)字符串元素,現(xiàn)在我要過濾出list容器不等于neo4j的元素. 大佬們肯定都能看懂吧,結(jié)果肯定輸入spring,hibernate
那么現(xiàn)在就用Java8 開始替換: 使用collect()將一個(gè)List轉(zhuǎn)化為steam(流),然后使用stream.filter() 來過濾它.
public static void main(String[] args) {
List<String> lines = Arrays.asList("spring", "hibernate", "neo4j");
List<String> result = lines.stream() // 轉(zhuǎn)化為一個(gè)流
.filter(line -> !"neo4j".equals(line)) // 排除 'String'
.collect(Collectors.toList()); // 吧輸出流收集回List中
result.forEach(System.out::println); //輸出 : spring, hibernate
}
是不是很簡單, 小伙伴趕緊動(dòng)手敲一下吧
Streams 中 filter(), findAny() 和 orElse()的用法
下面直接上代碼
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private int age;
}
在Java 8以前, 你想通過name獲取一個(gè)Person通常像這樣 :
public static void main(String[] args) {
List<User> userList = Arrays.asList(
new User("mkyong", 30),
new User("jack", 20),
new User("lawrence", 40)
);
User result = getStudentByName(userList, "jack");
System.out.println(result);
}
private static User getStudentByName(List<User> userList, String name) {
User result = null;
for (User temp : userList) {
if (name.equals(temp.getName())) {
result = temp;
}
}
return result;
}
輸入結(jié)果可想而知 User{name='Enoch', age=40}
那么趕緊看下在Java 8中怎么實(shí)現(xiàn)吧, 下面使用 stream.filter()來過濾 List,使用 .findAny().orElse (null) 來返回指定的對(duì)象.直接上代碼
public static void main(String[] args) {
List<User> userList = Arrays.asList(
new User("張三", 30),
new User("李四", 20),
new User("Enoch", 40)
);
User result1 = userList.stream() // 轉(zhuǎn)化為流
.filter(x -> "Enoch".equals(x.getName())) // 只過濾出"Enoch"
.findAny() // 如果找到了就返回
.orElse(null); // 如果找不到就返回null
System.out.println(result1);
User result2 = userList.stream()
.filter(x -> "Enoch".equals(x.getName()))
.findAny()
.orElse(null);
System.out.println(result2);
}
是不是超級(jí)簡單,小伙子不要飄啊, 那下面看看這段代碼是否能看懂呢
public static void main(String[] args) {
List<User> userList = Arrays.asList(
new User("張三", 30),
new User("李四", 20),
new User("Enoch", 40)
);
User result1 = userList.stream()
.filter((p) -> "李四".equals(p.getName()) && 20 == p.getAge())
.findAny()
.orElse(null);
System.out.println("result 1 :" + result1);
//或者這樣寫
User result2 = userList.stream()
.filter(p -> "Enoch".equals(p.getName()) && 20 == p.getAge()).findAny()
.orElse(null);
System.out.println("result 2 :" + result2);
}
如果上面也看懂了那么恭喜你,好厲害, 那下面繼續(xù)往下看吧
Streams中 filter() 和 map()的用法
public static void main(String[] args) {
List<User> userList = Arrays.asList(
new User("張三", 30),
new User("李四", 20),
new User("Enoch", 40)
);
String name = userList.stream()
.filter(x -> "Enoch".equals(x.getName()))
.map(User::getName) //吧流轉(zhuǎn)化為String,這里其實(shí)就是
//把一個(gè)新的事物轉(zhuǎn)為另外一種事物了.類型得到了轉(zhuǎn)換
.findAny()
.orElse("");
System.out.println("name : " + name);
List<String> collect = userList.stream()
.map(User::getName)
.collect(Collectors.toList());
collect.forEach(System.out::println);
}
map()函數(shù)解釋: 如果有一個(gè)函數(shù)可以將一種類型的值轉(zhuǎn)換成另外一種類型,map 操作就可以 使用該函數(shù),將一個(gè)流中的值轉(zhuǎn)換成一個(gè)新的流。 map 是 Stream 上最常用的操作之一
小伙伴們沒有看懂map不要緊哦,下一章會(huì)繼續(xù)介紹map哦,come on
是不是很簡單呢. 其實(shí)要想理解map還是稍微有難度的. 如果有什么疑問請(qǐng)歡迎留言哦.