Java 8 Streamsフィルタの例

このチュートリアルでは、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解説:フィルタ、マップ、ストリーム、およびForeachを使用してLambdasを適用する Javaコレクションに!]。リンク://java8/java-8-foreach-examples/[Java 8 forEachの例]

8つのストリーム:複数のフィルタ対複雑な条件]。 処理中

Java SE 8ストリームによるデータ]

リンク://タグ/コレクター/[コレクター]リンク://タグ/フィルター/[フィルター]リンク://タグ/java8/[java8]リンク://タグ/ストリーム/[ストリーム]

前の投稿:Spring MVCフォームの処理の例
次の投稿:IntelliJ IDEA - TomcatでWebアプリケーションを実行/デバッグする