Рубрики
Без рубрики

Примеры фильтров потоков Java 8

– Примеры фильтров потоков Java 8

В этом уроке мы покажем вам несколько примеров Java 8, чтобы продемонстрировать использование потоков filter() , collect() , find Any() и или иначе()

1. Потоки фильтруют() и собирают()

1.1 Перед Java 8 отфильтруйте Список подобный этому:

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 lines = Arrays.asList("spring", "node", "mkyong");
        List result = getFilterOutput(lines, "mkyong");
        for (String temp : result) {
            System.out.println(temp);    //output : spring, node
        }

    }

    private static List getFilterOutput(List lines, String filter) {
        List 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, stream.filter() для фильтрации списка и сбора() для преобразования потока в Список .

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 lines = Arrays.asList("spring", "node", "mkyong");

        List 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. Потоки фильтруют(), находят любые() и или еще()

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 вы получаете Человека по имени, как это:

package com.mkyong.java8;

import java.util.Arrays;
import java.util.List;

public class BeforeJava8 {

    public static void main(String[] args) {

        List 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 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() для фильтрации списка и .findAny().OrElse (null) для возврата условного объекта.

package com.mkyong.java8;

import java.util.Arrays;
import java.util.List;

public class NowJava8 {

    public static void main(String[] args) {

        List 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 Для нескольких условий.

package com.mkyong.java8;

import java.util.Arrays;
import java.util.List;

public class NowJava8 {

    public static void main(String[] args) {

        List 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. Фильтр потоков() и карта()

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 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 collect = persons.stream()
                .map(Person::getName)
                .collect(Collectors.toList());

        collect.forEach(System.out::println);

    }
    
}

Выход

name : jack

mkyong
jack
lawrence

Рекомендации

  1. Циклический вывод Java 8 в моем случае
  2. Java 8 Объяснено: Использование фильтров, карт, потоков и Foreach для применения лямбда-выражений к коллекциям Java!
  3. Java 8 Примеры для каждого
  4. Потоки Java 8: несколько фильтров против сложного условия
  5. Обработка данных с помощью потоков Java SE 8

Оригинал: “https://mkyong.com/java8/java-8-streams-filter-examples/”