I have a list student list A and I have student list B.
Student objects contains some fields like that : no,age,city,birth_date,salary
My list A contains these objects
JavaScript
x
A=[1 , 20 , Rome , 2001, 300 ]
[2 , 21 , Dublin , 2005, 250 ]
[3 , 24 , Istanbul, 2012, 350 ]
[4 , 27 , Madrid , 2002, 450 ]
[5 , 27 , London , 2005, 650 ]
My list B contains these objects
JavaScript
B=[1, 20 , Rome , 2014, 700 ]
[3, 24 , Istanbul, 2012, 350 ]
[4, 27 , Madrid, 2009, 450 ]
What i want to do is extract student objects that ListA have but listB not and ListA and ListB have(as no,age,city) but salary is different.Also I want to write salary diff.
JavaScript
Result set = [5 , 27 ,London, 2005, 650 ]
[2 , 21 ,Dublin ,2005, 250 ]
[1, 20, Rome , 2001, -400]
I want to use stream api in java 8.First of all , I want to extract students objects to a list but I can extract common student objects now.I tried tu use noneMatch but it is not working.Do you have any idea?
JavaScript
List<Student> listDiffList = A.stream()
// We select any elements such that in the stream of elements from the second list
.filter(two -> B.stream()
// there is an element that has the same name and school as this element,
.anyMatch(one -> one.getNo().equals(two.getNo())
&& one.getAge().equals(two.getAge())
&& one.getCity().equals(two.getCity())))
// and collect all matching elements from the first list into a new list.
.collect(Collectors.toList());
Advertisement
Answer
I used custom Collector object, looks not very nice but it seems working:
JavaScript
List<Student> listDiffList =
A.stream()
.collect(ArrayList::new,
(a, two) -> {
Optional<Student> one = B.stream()
.filter(s -> s.getNo().equals(two.getNo())
&& s.getAge().equals(two.getAge())
&& s.getCity().equals(two.getCity()))
.findAny();
if (one.isPresent()) {
if (!one.get().getSalary().equals(two.getSalary())) {
two.setSalary(two.getSalary()-one.get().getSalary());
a.add(two);
}
}
else a.add(two);
},
ArrayList::addAll);