我有一个列表列表,我想使用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()的签名。有人可以给我一个提示吗?
答案 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返回可选值。