【问题标题】:Convert List of Objects to List of String with filter using Java Streams使用 Java Streams 将对象列表转换为带有过滤器的字符串列表
【发布时间】:2019-11-26 22:18:15
【问题描述】:

从对象列表中获取所有 estd 代码值,其中iEflag 值为“E”。试过了,但没用。

List<String> estdCodeList = applEstdList.stream()
                    .map(StdCode::getEstdCode)
                    .filter(x -> x.getiEflag().equals("E"))
                    .collect(Collectors.toList());

其中applEstdListStdCode 类型的对象列表。

public class StdCode   implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private String applnCode;
    private String estdCode;
    private String iEflag;

}

我尝试使用 Java Streams 转换此代码。在此处使用 Stream 是否有任何性能优势?

List<String> iEflagIsE = new ArrayList<String>();
                List<String> iEflagIsNotE = new ArrayList<String>();

                //Creating the respective exclusion inclusion list
                for(ApplicationEstCode applnList :applEstList){
                    if(applnList.getiEflag().equals("E")){
                        iEflagIsE.add(applnList.getEstCode());
                    }else{
                        iEflagIsNotE.add(applnList.getEstCode());
                    }
                }

【问题讨论】:

  • 哪个对象带有getiEflag()方法? applEstdList列表的类型是什么?
  • 同一个对象,StdCode
  • applEstdList列表的类型是什么?先看看这个,看看如何发布一个可重现的例子:stackoverflow.com/help/minimal-reproducible-example
  • @RavindraRanwala 如问题 applEstdListStdCode 类型的对象列表中提到的,虽然声明了List 的类型,但几乎可以推断stdCode 不是String,给定过滤操作x.getiEflag().equals("E") 并收集到List&lt;String&gt;,缺少映射操作。 @user630209 与使用中的基本属性共享 StdCode 类模型将进一步改善问题。
  • @RavindraRanwala 用 StdCode 对象更新了问题。

标签: java collections java-8 java-stream


【解决方案1】:

你错过了另一个mapping,可能是:

List<String> stdCodeList = applEstdList.stream()
                .map(StdCode::getStdCode)
                .map(a -> a.getiEflag())
                .filter(x -> x.equals("E"))
                .collect(Collectors.toList());

或将map 操作组合到:

List<String> stdCodeList = applEstdList.stream()
                .map(applEstd -> applEstd.getStdCode().getiEflag())
                .filter(iEflag -> iEflag.equals("E"))
                .collect(Collectors.toList());

【讨论】:

    【解决方案2】:

    问题是这一行:

    .map(StdCode::getEstdCode)

    将您的源 StdCode 类型集合转换为 estdCode 字符串的集合,然后将此输出传递给下一个 filter 方法。我认为它应该抱怨一个错误,例如该方法不存在,因为您正在向它提供一个没有 `getiEflag()) 方法的 String 对象集合。

    如果改变这两种方法的顺序:

    List<String> estdCodeList = applEstdList.stream()
                        .filter(x -> x.getiEflag().equals("E"))
                        .map(StdCode::getEstdCode)
                        .collect(Collectors.toList());
    

    应该可以的。

    【讨论】:

      猜你喜欢
      • 2019-01-17
      • 1970-01-01
      • 2018-03-26
      • 2018-04-27
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多