簡體   English   中英

如何在條件下迭代列表列表並在 Map 中返回值?

[英]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 ClassOneid作為“鍵”並將ClassTwo中的link作為“值”。

注意:它應該只使用而不是循環來實現,並且僅限於Java 8

  • 返回類型應為: Map<Long, List<Long>>
  • 更清晰: Map<id, List<link>>

請讓我知道更多說明

我向ClassOneClassTwoClassThree類添加了額外的代碼,以便編寫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]}

換句話說, ClassOneid是 0(零)——這是 map 鍵和 map 值是一個包含單個元素的列表,該元素是ClassTwolink的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM