このチュートリアルでは、Streamsの
filter()
、
collect()
、
findAny()
、 `orElse()`の使い方を示すJava 8のサンプルをいくつか紹介します。
1. filter()と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;
}
}
出力
spring node
1.2 Java 8の同等の例、
list`をフィルタリングする
stream.filter()
、ストリームを
List`に変換する `collect()`の例です。
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
}
}
出力
spring node
2. filter()、findAny()、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;
}
}
出力
Person{name='jack', age=20}
2.2 Java 8の同等の例では、
stream.filter()`を使って `List`をフィルタリングし、
.findAny().Else(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);
}
}
出力
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);
}
}
出力
result 1 :Person{name='jack', age=20}
result 2 :Person{name='jack', age=20}
3. filter()と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);
}
}
出力
name : jack mkyong jack lawrence
参考文献
私の場合は8周期推論]。
http://zeroturnaround.com/rebellabs/java-8-explained-applying-lambdas-to-java-collections/
[Java
8解説:フィルタ、マップ、ストリーム、およびForeachを使用してLambdasを適用する
Javaコレクションに!]。リンク://java8/java-8-foreach-examples/[Java 8 forEachの例]
8つのストリーム:複数のフィルタ対複雑な条件]。
処理中
Java SE 8ストリームによるデータ]
リンク://タグ/コレクター/[コレクター]リンク://タグ/フィルター/[フィルター]リンク://タグ/java8/[java8]リンク://タグ/ストリーム/[ストリーム]