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);
}
}