我遇到了一个问题,我没有设法解决......
我有3种类型的对象
我有2个名单:
我想创建MyJoinObject的第三个列表,它是2个列表的连接。 将MyJoinObject对象作为MyObject1对象,但如果存在,它们也将包含错误(由id加入)。 我想用Java 8流做 。
答案 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