相关疑难解决方法(0)

在Stream :: flatMap中使用Java 8的Optional

新的Java 8流框架和朋友们制作了一些非常简洁的Java代码,但是我遇到了一个看似简单的情况,简单易懂.

考虑一个List<Thing> things方法Optional<Other> resolve(Thing thing).我想将Things 映射到Optional<Other>s并获得第一个Other.显而易见的解决方案是使用things.stream().flatMap(this::resolve).findFirst(),但flatMap要求您返回一个流,并且Optional没有stream()方法(或者它是Collection一个方法或提供将其转换为或以其方式查看的方法Collection).

我能想到的最好的是:

things.stream()
    .map(this::resolve)
    .filter(Optional::isPresent)
    .map(Optional::get)
    .findFirst();
Run Code Online (Sandbox Code Playgroud)

但这似乎是一个非常普遍的案例,似乎非常冗长.谁有更好的主意?

java lambda java-8 java-stream

221
推荐指数
7
解决办法
13万
查看次数

可选vs抛出异常

是不是因为Java 1.8返回Optional对象比抛出异常更可取?我越来越多地看到这样的代码:

  public Optional<?> get(int i) {
        // do somtething
        Object result = ...
        Optional.ofNullable(result);
    }
Run Code Online (Sandbox Code Playgroud)

而不是这个:

public Object get(int i) {
        if(i<0 || i>=size) {
            throw new IndexOutOfBoundsException("Index: " + i + ". Size: " + size);
        }
        // do somtething
        Object result = ...
        return result;
    }
Run Code Online (Sandbox Code Playgroud)

是否意味着我们需要忘记旧方法并使用新方法?什么地方Optional适合?

java optional java-8

19
推荐指数
3
解决办法
8726
查看次数

标签 统计

java ×2

java-8 ×2

java-stream ×1

lambda ×1

optional ×1