java1.8特性-Lambda
新建一个实体的例子
public class Person {
String name;
int age;
String flag = "标记";
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
}
}
场景:挑出大于18岁的成年人并标记一下
public class LambdaTest {
Person p1 = new Person("lee", 12);
Person p2 = new Person("wang", 19);
Person p3 = new Person("zhao", 20);
List<Person> persons = Arrays.asList(p1, p2, p3);
List<Person> persons2 = new ArrayList<Person>();
@Test
public void getLambda() {
for (Person person : persons
) {
if (person.getAge() > 18) {
person.setFlag("成年");
persons2.add(person);
}
}
System.out.println("========java基本的实现=======");
for (int i = 0; i < persons2.size(); i++) {
System.out.println(persons2.get(i).getName() + ":" + persons2.get(i).getAge()+ ":" + persons2.get(i).getFlag());
}
System.out.println("========Lambda功能的实现=======");
List<Person> personList = persons.stream()
.filter(p -> p.getAge() > 18)
.map(p -> {
p.setFlag("成年");
return p;
})
.collect(Collectors.toList());
personList.forEach(p->System.out.println(p.getName() + ":" + p.getAge()+ ":" + p.getFlag()));
}
}
关于stream的常规用法:集合、数组的stream操作的三个步骤:1、创建一个流Stream 2、中间操作map、filter 3、终止操作collect、forEach
//参考:http://www.importnew.com/19838.html 理论
// https://www.zhihu.com/question/20125256/answer/324121308 图示的方式
//https://blog.csdn.net/op134972/article/details/76408237?locationNum=1&fps=1 java8新特性 主要的5点
//集合、数组的stream操作的三个步骤:1、创建一个流Stream 2、中间操作map、filter 3、终止操作 collect、forEach
/**
* map的使用,注意接收入参并返回
* 对集合属性的修改,这里大于18岁的标记为成年
* 利用Collectors工具类的toList()收集操作的最后的接口
*/
@Test
public void mapTest() {
persons2 = persons.stream()
.map(p -> {
p.setFlag("成年");
return p;
}).collect(Collectors.toList());
persons2.forEach(p -> System.out.println(p.getName() + ":" + p.getAge() + ":" + p.getFlag()));
}
/**
* filter 的使用
* 对集合属性的条件查询,这里大于18岁的标记为成年
*/
@Test
public void filterTest() {
persons2 = persons.stream().filter(p -> p.getAge() > 18).collect(Collectors.toList());
persons2.forEach(p -> System.out.println(p.getName() + ":" + p.getAge()));
}
Optional的用法:实际上是一个容器,它可以保存类型T的值,减少空指针的异常。
@Test
public void optionalTest() {
Person person = null;
Optional<Person> personOptional = Optional.ofNullable(person);
// 1、orElse如果创建的Optional中有值存在,则返回此值,否则返回一个默认值
// System.out.println(Optional.ofNullable(person).map(Person::getAge).orElse(18));
// 2、orElseGet如果创建的Optional中有值存在,则返回此值,否则返回一个由Supplier接口生成的返回值
// System.out.println(Optional.ofNullable(person).map(Person::getAge).orElseGet(()->{return 18;}));
// System.out.println(personOptional.map(Person::getAge)
// .orElseGet(()->new Person("lee4",22).getAge()));
person = personOptional
.orElseGet(() -> new Person("lee4", 22));
System.out.println(person);
persons = null;
Optional<List<Person>> personsOptional = Optional.ofNullable(persons);
List<Person> personList = personsOptional.orElseGet(Collections::emptyList);
System.out.println(personList);
}
}