如何在Java 8流调用上运行多个操作

uubf1zoe  于 2023-10-14  发布在  Java
关注(0)|答案(3)|浏览(92)

假设我使用java 8流将int []nums转换为List<Integer>

List<Integer> l = Arrays.stream(nums).mapToObj(i->i).collect(Collectors.toList())

也就是说,我想看到一个独立的操作,如果List<Integer>中的所有元素都有一个值,比如5,我可以这样做,我认为boolean match = list.stream().allMatch(s -> s.equals(list.get(5)));
我如何合并2在Arrays.stream()期间不仅要将其转换为List<Integer>,而且所有元素的轨迹都相同?

envsm3lx

envsm3lx1#

不能从流中返回多个类型。因此,您需要将信息存放在类或其他结构中(例如,这里我创建一个类来保存结果。SummaryStatistics做类似的事情。

int[] nums = {5,5,5,5,5};
Info<Integer> results = Arrays.stream(nums).boxed().reduce(new Info<>(),
        Info::add,
        (a,b)->a); // combiner - required but not used in this case

System.out.println(results.getList());
System.out.println(results.areAllTheSame());

指纹

[5, 5, 5, 5, 5]
true
  • add()方法将值添加到列表中,如果item与添加的first值匹配,则增加count。count默认为1。它还返回this以简化reduce方法,因为累加器预期返回更新后的值。
  • reduce首先创建一个类,在其中存储值。
  • allAreTheSame()返回boolean,该值是将计数与列表大小进行比较得到的。
class Info<T> {
    private T first = null;
    private List<T> list = new ArrayList<>();
    private int count = 1;

    public Info<T> add(T item) {
        list.add(item);
        if (first == null) {
            first = item;
        } else if (first == item) {
            count++;
        } 
        return this;
    }
    
    public List<T> getList() {
        return list;
    }

    public boolean areAllTheSame() {
        return count == list.size();
    }
}
8i9zcol2

8i9zcol22#

您可以使用teeeing收集器同时执行这两项任务。例如:

int[] nums = {6,5,5,5,5};
HashMap<String, Object> result = Arrays.stream(nums)
                                       .boxed()
                                       .collect(Collectors.teeing(
                                               Collectors.toList(),
                                               Collectors.filtering(i -> i != 5,Collectors.counting()),
                                               (myList, count) -> {
                                                   HashMap<String, Object> map = new HashMap();
                                                   map.put("myList", myList);
                                                   map.put("myBool", count == 0);
                                                   return map;})
                                               );

System.out.println(result.get("myList"));
System.out.println(result.get("myBool"));

但你可以不代表你应该

不把给予两种完全不同的结果的合并结合起来,而是分开来做,这要容易理解得多,也干净得多。没有什么不对的:

List<Integer> list = Arrays.stream(nums).boxed().toList();
boolean allFives = list.stream().allMatch(i -> i == 5);
omvjsjqw

omvjsjqw3#

  • "..“*

我想你可以把 null 赋值给 l,如果 nums 不全是 5 的话。

int []nums = { 1, 2, 3 };
List<Integer> l
    = IntStream.of(nums).allMatch(i->i == 5)
    ? IntStream.of(nums).boxed().toList()
    : null;

相关问题