本套JAVA8教程由于是有英文翻译过来的,如果有翻译不对的地方还请多多包涵。
本节课先简单的介绍下Java8有哪些新特性,对于Java6/7版本做出哪些更改.那废话不多说,赶紧开始今天的课程吧.
在这篇教程中我将向你展示 filter(), collect(), findAny() 和 orElse() 的用法
Streams 中 filter() 和 collect() 函数的用法
在 Java 8 以前, 我们会像下面这样过滤一个 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;
}
以上代码大致意思就是创建了一个list容器,里面存放了spring
,hibernate
,neo4j
三个字符串元素,现在我要过滤出list容器不等于neo4j的元素. 大佬们肯定都能看懂吧,结果肯定输入spring
,hibernate
那么现在就用Java8 开始替换: 使用collect()将一个List转化为steam(流),然后使用stream.filter() 来过滤它.
public static void main(String[] args) {
List<String> lines = Arrays.asList("spring", "hibernate", "neo4j");
List<String> result = lines.stream() // 转化为一个流
.filter(line -> !"neo4j".equals(line)) // 排除 'String'
.collect(Collectors.toList()); // 吧输出流收集回List中
result.forEach(System.out::println); //输出 : spring, hibernate
}
是不是很简单, 小伙伴赶紧动手敲一下吧
Streams 中 filter(), findAny() 和 orElse()的用法
下面直接上代码
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private int age;
}
在Java 8以前, 你想通过name获取一个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;
}
输入结果可想而知 User{name='Enoch', age=40}
那么赶紧看下在Java 8中怎么实现吧, 下面使用 stream.filter()来过滤 List,使用 .findAny().orElse (null) 来返回指定的对象.直接上代码
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(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);
}
是不是超级简单,小伙子不要飘啊, 那下面看看这段代码是否能看懂呢
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);
}
如果上面也看懂了那么恭喜你,好厉害, 那下面继续往下看吧
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) //吧流转化为String,这里其实就是
//把一个新的事物转为另外一种事物了.类型得到了转换
.findAny()
.orElse("");
System.out.println("name : " + name);
List<String> collect = userList.stream()
.map(User::getName)
.collect(Collectors.toList());
collect.forEach(System.out::println);
}
map()函数解释: 如果有一个函数可以将一种类型的值转换成另外一种类型,map 操作就可以 使用该函数,将一个流中的值转换成一个新的流。 map 是 Stream 上最常用的操作之一
小伙伴们没有看懂map不要紧哦,下一章会继续介绍map哦,come on
是不是很简单呢. 其实要想理解map还是稍微有难度的. 如果有什么疑问请欢迎留言哦.