簡體   English   中英

嵌套循環轉換為 Java Stream

[英]Nested loop conversion to Java Stream

我有一個List<Person>人。 我需要迭代一個數字列表並為每個人設置一個自定義數字,例如person.setCustomNumber() ,如下所示:

代碼如下所示:

public static void main(String[] args) {

    List<Long> customNumnbers = new ArrayList<>();
    customNumnbers.add(100000l);
    customNumnbers.add(100001l);
    customNumnbers.add(100002l);
    customNumnbers.add(100003l);
    customNumnbers.add(100004l);
    customNumnbers.add(100005l);
    customNumnbers.add(100006l);
    customNumnbers.add(100007l);
    customNumnbers.add(100008l);
    
    List<Person> persons = new ArrayList<>();
    persons.add(new Person("Robert"));
    persons.add(new Person("Jim"));
    persons.add(new Person("Mark"));
    persons.add(new Person("Beto"));
    persons.add(new Person("Reando"));
    
    Map<String, Long> map = new HashMap<>();
    List<Long> possibleNumbers = customNumnbers.subList(0, persons.size());
    int n = 0;
    while(n != possibleNumbers.size()) {    
        for (int j = 0; j < persons.size(); j++) {
            persons.get(j).setCustomNumer(possibleNumbers.get(n));
            map.put(persons.get(j).getName(), persons.get(j).getCustomNumer());
            n++;
        }

    }
    map.entrySet().stream().forEach(System.out::println);
}

class Person {
    private Long id;
    private String name;
    private Long customNumer;
    // relevant constructor, getters and setters
}

我想在 java 流中重寫此邏輯,並為每個類似Map<String, Long> map 的名稱和自定義編號返回一個新的 map。

您可以在循環中分配數字:

int assignableCount = Math.min(persons.size(), possibleNumbers.size());
for (int i = 0; i < assignableCount; i++)
    persons.get(i).setCustomNumber(possibleNumbers.get(i));

然后使用流構建 map:

Map<String, Long> map = persons.stream()
    .collect(Collectors.toMap(Person::getName, Person::getCustomNumber);

整個事情可以使用IntStream.range(int, int)來簡化。

// assure the runtime exception is not thrown due to exceeding any of the lists size
int n= Math.min(customNumnbers.size(), persons.size());  

Map<String, Long> map = IntStream.range(0, n) // iterate indixes 0..n
    .boxed()                                  // Stream<Integer> rather than IntStream
    .collect(Collectors.toMap(                // collect to a Map<String, Long>
        i -> persons.get(i).getName(),        // .. Person's name as a key from persons
        customNumbers::get));                 // .. the Long as a value from customNumbers

順便提一句。 您在customNumnbers中有一個錯字,應該是customNumbers - 我在我的解決方案中修復了它。

暫無
暫無

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

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