[英]How to iterate list of list on a condition and to return value in Map?
public class ClassOne {
private Long id;
private List<ClassTwo> secondClass;
}
public class ClassTwo {
private Long link;
private ClassThree thirdClass;
}
public class ClassThree {
private Long number;
}
可用數據:
List<classOne> classOneList
List<Long> referencedNumbers
要求:
迭代classOneList
並將值存儲在Map<Long, <ListLong>>
中,僅當referencedNumbers
包含ClassThree
ClassOne
的id
作為“鍵”並將ClassTwo
中的link
作為“值”。
注意:它應該只使用流而不是循環來實現,並且僅限於Java 8
Map<Long, List<Long>>
Map<id, List<link>>
請讓我知道更多說明
我向ClassOne
、 ClassTwo
和ClassThree
類添加了額外的代碼,以便編寫SSCCE 。
您的要求的實現(如您的問題所述)在 class Main
的方法main
中。
代碼后有更多解釋。
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
ClassThree c3 = new ClassThree(3L); // create 'ClassThree' instance
ClassTwo c2 = new ClassTwo(5L, c3); // create 'ClassTwo' instance
List<ClassTwo> c2s = List.of(c2); // create 'List<ClassTwo>'
ClassOne c1 = new ClassOne(0L, c2s); // create 'ClassOne' object
List<ClassOne> classOneList = List.of(c1);
List<Long> referencedNumbers = List.of(3L);
// Obtains map value (see below), i.e. list of links.
Function<ClassOne, List<Long>> valMapper = cOne -> cOne.getSecondClass()
.stream() // Stream<ClassTwo>
.map(cTwo -> cTwo.getLink()) // Stream<Long>
.collect(Collectors.toList()); // List<Long>
Map<Long, List<Long>> map = classOneList.stream()
.filter(cOne -> cOne.getSecondClass().stream()
.filter(cTwo -> referencedNumbers.contains(cTwo.getThirdClass().getNumber()))
.findFirst()
.isPresent())
.collect(Collectors.toMap(cOne -> cOne.getId(), // obtains map key.
valMapper));
System.out.println(map);
}
}
class ClassOne {
private Long id;
private List<ClassTwo> secondClass;
public ClassOne(Long id, List<ClassTwo> c2s) {
this.id = id;
secondClass = c2s;
}
public Long getId() {
return id;
}
public List<ClassTwo> getSecondClass() {
return secondClass;
}
}
class ClassTwo {
private Long link;
private ClassThree thirdClass;
public ClassTwo(Long ln, ClassThree c3) {
link = ln;
thirdClass = c3;
}
public Long getLink() {
return link;
}
public ClassThree getThirdClass() {
return thirdClass;
}
}
class ClassThree {
private Long number;
public ClassThree(Long num) {
number = num;
}
public Long getNumber() {
return number;
}
}
對於classOneList
中的每個元素,“過濾器”在其secondClass
列表中搜索出現在referencedNumbers
中的數字。
從過濾后的列表中,我創建了 map。
當我運行上面的代碼時,它輸出以下內容:
{0=[5]}
換句話說, ClassOne
的id
是 0(零)——這是 map 鍵和 map 值是一個包含單個元素的列表,該元素是ClassTwo
中link
的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.