Streams filter 例子 (函數語言程式設計 ) Java 8
阿新 • • 發佈:2018-11-25
在本教程中,我們將向你展示一些java 8個例子來演示的流filter(),collect()使用,findany()和orelse().
1. Streams filter() and collect()
1.1 Java 8之前, 過濾一 List
如下所示 :
BeforeJava8.java
package com.mkyong.java8; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class BeforeJava8 { public static void main(String[] args) { List<String> lines = Arrays.asList("spring", "node", "mkyong"); List<String> result = getFilterOutput(lines, "mkyong"); for (String temp : result) { System.out.println(temp); //output : spring, node } } private static List<String> getFilterOutput(List<String> lines, String filter) { List<String> result = new ArrayList<>(); for (String line : lines) { if (!"mkyong".equals(line)) { // we dont like mkyong result.add(line); } } return result; } }
Output
spring
node
1.2 在java 8,流等效的例子。filter()過濾列表,和collect()一起轉換流到一個List中。
NowJava8.java
package com.mkyong.java8; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class NowJava8 { public static void main(String[] args) { List<String> lines = Arrays.asList("spring", "node", "mkyong"); List<String> result = lines.stream() // convert list to stream .filter(line -> !"mkyong".equals(line)) // we dont like mkyong .collect(Collectors.toList()); // collect the output and convert streams to a List result.forEach(System.out::println); //output : spring, node } }
2. Streams filter(), findAny() and orElse()
Person.java
package com.mkyong.java8; public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } //gettersm setters, toString }
2.1 在java 8之前, 你會像下面示例的樣子獲取一個Person
物件 :
BeforeJava8.java
package com.mkyong.java8;
import java.util.Arrays;
import java.util.List;
public class BeforeJava8 {
public static void main(String[] args) {
List<Person> persons = Arrays.asList(
new Person("mkyong", 30),
new Person("jack", 20),
new Person("lawrence", 40)
);
Person result = getStudentByName(persons, "jack");
System.out.println(result);
}
private static Person getStudentByName(List<Person> persons, String name) {
Person result = null;
for (Person temp : persons) {
if (name.equals(temp.getName())) {
result = temp;
}
}
return result;
}
}
Output
Person{name='jack', age=20}
2.2 在java 8使用流等效的例子, 用stream.filter() 過濾List .findAny().orElse (null) 返回一個物件的條件。
NowJava8.java
package com.mkyong.java8;
import java.util.Arrays;
import java.util.List;
public class NowJava8 {
public static void main(String[] args) {
List<Person> persons = Arrays.asList(
new Person("mkyong", 30),
new Person("jack", 20),
new Person("lawrence", 40)
);
Person result1 = persons.stream() // Convert to steam
.filter(x -> "jack".equals(x.getName())) // we want "jack" only
.findAny() // If 'findAny' then return found
.orElse(null); // If not found, return null
System.out.println(result1);
Person result2 = persons.stream()
.filter(x -> "ahmook".equals(x.getName()))
.findAny()
.orElse(null);
System.out.println(result2);
}
}
Output
Person{name='jack', age=20}
null
2.3 多個條件.
NowJava8.java
package com.mkyong.java8;
import java.util.Arrays;
import java.util.List;
public class NowJava8 {
public static void main(String[] args) {
List<Person> persons = Arrays.asList(
new Person("mkyong", 30),
new Person("jack", 20),
new Person("lawrence", 40)
);
Person result1 = persons.stream()
.filter((p) -> "jack".equals(p.getName()) && 20 == p.getAge())
.findAny()
.orElse(null);
System.out.println("result 1 :" + result1);
//or like this
Person result2 = persons.stream()
.filter(p -> {
if ("jack".equals(p.getName()) && 20 == p.getAge()) {
return true;
}
return false;
}).findAny()
.orElse(null);
System.out.println("result 2 :" + result2);
}
}
Output
result 1 :Person{name='jack', age=20}
result 2 :Person{name='jack', age=20}
3. Streams filter() and map()
NowJava8.java
package com.mkyong.java8;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class NowJava8 {
public static void main(String[] args) {
List<Person> persons = Arrays.asList(
new Person("mkyong", 30),
new Person("jack", 20),
new Person("lawrence", 40)
);
String name = persons.stream()
.filter(x -> "jack".equals(x.getName()))
.map(Person::getName) //convert stream to String
.findAny()
.orElse("");
System.out.println("name : " + name);
List<String> collect = persons.stream()
.map(Person::getName)
.collect(Collectors.toList());
collect.forEach(System.out::println);
}
}
Output
name : jack
mkyong
jack
lawrence
注
強烈推薦這–處理資料流教程 – Processing Data with Java SE 8 Streams
References
- Java 8 cyclic inference in my case
- Java 8 Explained: Using Filters, Maps, Streams and Foreach to apply Lambdas to Java Collections!
- Java 8 forEach examples
- Java 8 Streams: multiple filters vs. complex condition
- Processing Data with Java SE 8 Streams
轉自: https://blog.csdn.net/wangmuming/article/details/72630250