System.out.println(" ");
}
@Override
public int compareTo(StudentInfo ob) {
return this.age.compareTo(ob.getAge());
//return 1;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getGender() {
return gender;
}
public void setGender(Boolean gender) {
this.gender = gender;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Double getHeight() {
return height;
}
public void setHeight(Double height) {
this.height = height;
}
public LocalDate getBirthday() {
return birthday;
}
public void setBirthday(LocalDate birthday) {
this.birthday = birthday;
}
}
测试代码
package com.god.genius.baisc.jdk.jdk8.streamFilter.student;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
- @author lisir
*/
public class Demo {
public static void main(String[] args) {
List<StudentInfo> list = new ArrayList<>();
list.add(new StudentInfo("李白", true, 18, 1.76, LocalDate.of(2001, 3, 23)));
list.add(new StudentInfo("大乔", false, 18, 1.68, LocalDate.of(2001, 6, 3)));
list.add(new StudentInfo("凯皇", true, 19, 1.82, LocalDate.of(2000, 3, 11)));
list.add(new StudentInfo("小乔", false, 17, 1.61, LocalDate.of(2002, 10, 18)));
//查询所有英雄
StudentInfo.printStudents(list);
//查找18岁的英雄
List<StudentInfo> collect = list.stream().filter(s -> s.getAge() == 19).collect(Collectors.toList());
StudentInfo.printStudents(collect);
综合查询:查找身高在1.8米及以上且年龄小于19岁的英雄
List<StudentInfo> boys = list.stream().filter(s -> s.getGender() && s.getHeight() >= 1.66 && s.getAge() < 19).collect(Collectors.toList());
//输出查找结果
StudentInfo.printStudents(boys);
list.forEach(s -> System.out.println(s.toString()));
list.stream().forEach(s->System.out.println(s.toString()));
}
}
二、Streams 中 filter(), findAny() 和 orElse()的用法
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 userList, String name) {
User result = null;
for (User temp : userList) {
if (name.equals(temp.getName())) {
result = temp;
}
}
return result;
}
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);
}
四、Streams中 forache
filterLists.stream().forEach(s -> System.out.println(s));
Stream.generate(random).limit(10).forEach(System.out::println);//可传入方法
roster.stream().parallel().filter(p1.negate()).forEach(p -> t.test§);//也可以实现接口
五、strList.forEach(System.out::println);
// 创建出一个数组
List<String> strList = Arrays.asList("YangHang", "AnXiaoHei", "LiuPengFei");
strList.forEach(System.out::println);
首先, 我们看一下是java.lang.Iterable下的一个默认方法forEach调用的,一看到这个function包下面的被@FunctionalInterface注解声明的Consumer接口, 瞬间就了然了, 这不又是函数式编程搞的鬼么?
现在的问题应该很明朗了, System.out::println这段代码其实就是Consumer接口的一个实现方式啊。
具体是怎么实现,如下代码。
@Test
public void testDemo2() {
List<String> strList = Arrays.asList("YangHang", "AnXiaoHei", "LiuPengFei");
strList.forEach(x -> {
System.out.println(x);
});
}
然后, 我们惊喜的发现和上面的代码运行结果是一制的, 我们基本上可以断定, 上面那种写法是下面这种的一种缩写形式。 就是把你遍历出来的每一个对象都用来去调用System.out(也就是PrintStream类的一个实例)的println方法。
最后, 大家是不是有一个想法, 想自己写一个Consumer接口的实现类, 让foreach调用一下。
public class PrintUtil {
/**
* 对要遍历的元素添加add操作
*/
public void addString(String x) {
System.out.println(x + "add");
}
}
然后, 我们这么来玩
@Test
public void testDemo3() {
List<String> strList = Arrays.asList("YangHang", "AnXiaoHei", "LiuPengFei");
strList.forEach(new PrintUtil()::addString);
}