在列表列表中找到最小尺寸的列表

时间:2018-11-20 16:57:50

标签: java java-stream

我有一个列表列表,我想使用java Stream返回具有最小大小的列表。

这是我尝试过的:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Example {
   public static void main( String[] args )  {
         ArrayList<Integer> list1 = new ArrayList<>();
         list1.add(0);list1.add(2);list1.add(3);

         ArrayList<Integer> list2 = new ArrayList<>();
         list2.add(0);list2.add(2);list2.add(3);list2.add(4);

         System.out.println( getTheMinList(list1,list2).size());    
   }

   public static ArrayList<Integer> getTheMinList(ArrayList<Integer>... lists) {
         return Arrays.stream(lists)
                      .map(list->list.size())
                      /*here i stoped*/
                ;
   }
}

该程序应打印3,因为第一个列表的大小最小。

请注意,我无法更改 getTheMinList()的签名。有人可以给我一个提示吗?

2 个答案:

答案 0 :(得分:3)

您可以使用Stream.min比较List.size

public static List<Integer> getTheMinList(List<Integer>... lists){
    return Arrays.stream(lists)
            .min(Comparator.comparingInt(List::size))
            .orElse(new ArrayList<>());
}

或者如果您可以摆脱var-args和未经检查的赋值,可能会更好

private static List<Integer> getTheMinList(List<List<Integer>> lists){
    return lists.stream()
            .min(Comparator.comparingInt(List::size))
            .orElse(new ArrayList<>());
}
// invoked as
System.out.println(getTheMinList(List.of(list1, list2)).size());

答案 1 :(得分:3)

还有一个主意...

如@NullPointer所建议,我将使该方法采用List<List<Integer>>而不是varargs。

鉴于此更改,您只需执行以下操作即可:

Collections.min(lists, Comparator.comparingInt(List::size)); 

简短,简单易读,对吗?

请注意,以上内容将在集合为空时抛出NoSuchElementException,这也可能是您想要的预期行为,但是如果万一这不是您打算在空之前检查空性的预期行为,调用min或使用@NullPointer建议的流方法,如果Stream#min返回空的Optional,则使用Optional API返回可选值。