使用Java 8流

时间:2016-04-14 06:05:18

标签: java list join java-8 java-stream

我遇到了一个问题,我没有设法解决......

我有3种类型的对象

  1. MyObject1 - 包含字段ID和名称
  2. MyObject2 - 包含字段ID和错误
  3. MyJoinObject - 包含字段ID,名称和错误
  4. 我有2个名单:

    1. MyObject1的列表
    2. MyObject2列表
    3. 我想创建MyJoinObject的第三个列表,它是2个列表的连接。 将MyJoinObject对象作为MyObject1对象,但如果存在,它们也将包含错误(由id加入)。 我想用Java 8流做

3 个答案:

答案 0 :(得分:1)

你可以这样做:

List<MyJoinObject> result = 
    list1.stream().map( o1 -> {
        Optional<MyObject2> error = list2.steam()
                                         .filter( o2 -> o2.getId() == o1.getId() )
                                         .findAny();
        if ( error.isPresent() ) 
            return new MyJoinObject( o1.getId(), o1.getName(), error.get().getError() );      

        return new MyJoinObject( o1.getId(), o1.getName() );

    } ).collect( Collectors.toList() );

您还可以通过执行以下操作构建由id映射的错误的hasmap:

final Map<Integer, MyObject2> errorsById = 
     list2.stream( )
          .collect( Collectors.toMap( MyObject2::getId, Function.identity( ) ) );

如果您这样做,可以通过调用方法containsKey( )get( )来检索错误来使用此地图

答案 1 :(得分:1)

这样的事情可行(虽然我没有验证):

public static void main(String[] args) {
    List<MyObject1> object1list = new ArrayList<>(); // fill with data
    List<MyObject2> object2list = new ArrayList<>();// fill with data

    List<MyJoinObject> joinobjectlist = new ArrayList<>();

    object1list.stream().forEach(
            o1 -> object2list.stream().filter(
                    o2-> o1.getId()==o2.getId()
                    ).forEach(o2->joinobjectlist.add(
                            new JoinObject(o2.getId(), o1.getName(), o2.getError()))
                            )
            );

}

答案 2 :(得分:1)

供您参考:

public static void main(String[] args) {

    List<MyObject1> myObject1s = new ArrayList<>();
    List<MyObject2> myObject2s = new ArrayList<>();

    // convert myObject2s to a map, it's convenient for the stream
    Map<Integer, MyObject2> map = myObject2s.stream().collect(Collectors.toMap(MyObject2::getId, Function.identity()));

    List<MyJoinObject> myJoinObjects = myObject1s.stream()
                                                 .map(myObject1 -> new MyJoinObject(myObject1, map.get(myObject1.getId()).getError()))
                                                 .collect(Collectors.toList());

}

当然,MyJoinObject应该有一个新结构,如下所示:

public MyJoinObject(MyObject1 myObject1, String error){
    this.id = myObject1.getId();
    this.name = myObject1.getName();
    this.error = error;
}

这就是全部。 :P