使用StreamEx从Stream中删除空的Optionals

时间:2018-01-24 09:47:19

标签: java java-8 java-stream streamex

我正在寻找一种使用StreamEx库只传输非空Optional条目的优雅方法。或者标准库,如果可能的话。

目前我正在使用以下相当冗长的方法:

List<Optional<String>> list = 
   Arrays.asList(Optional.of("A"), Optional.empty(), Optional.of("B"));

List<String> nonEmpty = 
   StreamEx.of(list).filter(Optional::isPresent).map(Optional::get).toList();

我基本上在寻找类似StreamEx的nonNull方法,但适用于Optional

2 个答案:

答案 0 :(得分:5)

这已添加,但仅限于java-9:

<Data> void f(Class<Data> param ){
    printStaticFieldIfPresent( param, "Base" );
    printStaticFieldIfPresent( param, "First" );
    printStaticFieldIfPresent( param, "Second" );
}

void printStaticFieldIfPresent( Class<?> c, String fieldName ) {
   try { 
     System.out.println(c.getField(fieldName).get(null));      
   } catch( NoSuchFieldException e) {
     //ignore or log
   }
}

Stuart Marks here

有一个后端口

答案 1 :(得分:2)

对StreamEx问题积压的一些研究显示issue 49,它提供了一种更短的方法,并包含对该主题的讨论:

List<String> nonEmpty = StreamEx.of(list).flatMap(StreamEx::of).toList();

更短,虽然它是否更具可读性尚待讨论。