Получение первого элемента и возвращение после применения функции - PullRequest
3 голосов
/ 10 июля 2019

Я новичок в Java 8, я хочу создать метод, который получает первый элемент, который соответствует и возвращается после применения функции

public void test() {
    List<String> features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");

    String str = features
            .stream()
            .filter(s -> "Lambdas".equals(s))
            .findFirst()
            .ifPresent(this::toLowerCase);
}

private String toLowerCase (String str) {
    return str.toLowerCase();
}

, но я получил ошибку Несовместимые типы.

Ответы [ 3 ]

4 голосов
/ 10 июля 2019

Optional.ifPresent принимает Consumer и не возвращает никакого значения. Используйте map:

String str =
    features.stream()
            .filter(s -> "Lambdas".equals(s))
            .findFirst()
            .map(this::toLowerCase)
            .orElse(null); // default value or orElseThrow

Или, как предложил Хольгер, вы можете переместить шаг map в конвейер потока:

String str =
    features.stream()
            .filter(s -> "Lambdas".equals(s))
            .map(this::toLowerCase)
            .findFirst()
            .orElse(null); // default value or orElseThrow
2 голосов
/ 10 июля 2019

Вы можете отобразить строку, если она найдена orElse назначить null ей:

List<String> features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
String str = features
        .stream()
        .filter(s -> "Lambdas".equals(s))
        .findFirst()
        .map(String::toLowerCase)
        .orElse(null);
2 голосов
/ 10 июля 2019
 String str =
        features
            .stream()
            .filter("Lambdas"::equals)
            .findFirst()
            .map(this::toLowerCase)
            .orElse("AnythingElse");

findFirst возвращает Optional, поэтому для этого Optional используется некоторый метод, например orElse, который возвращает некоторый экземпляр String.

Посмотрите внимательно на то, что Optional::ifPresent принимает в качестве ввода - это Consumer, поэтому читайте его как "возьмите эту строку в качестве ввода, сделайте что-нибудь с ней и ничего не верните".

...