Java Lambda,流和过滤器

问题描述

我有一个数组[1,2,3,4,5],想做这样的事情。

创建一个新数组,其中所有低于3的元素将变为负数,且所有等于3的元素将保持不变。如果3以下没有元素,那么我不得不抛出一个错误。

因此,在这种情况下,新数组将为[-1,-2、3、4、5]。

如何使用lambda过滤器来做到这一点?

这是我的代码

AtomicInteger a = new AtomicInteger(0);

arrayList.stream()
    .map(data -> {
      if(data < 3) {a.getAndIncrement(); return -1 * data;}
      return data;
    })
    .collect(Collectors.toList());

if(a.get() == 0) {
  throw  new RuntimeException();
}

解决方法

您需要做什么

    List<Integer> mappingResult = Stream.of(1,2,3,4,5)
                                        .map(v -> v < 3 ? -v : v)
                                        .collect(Collectors.toList());
    mappingResult.stream().filter(v -> v < 3).findAny().orElseThrow(() -> new InvalidStateException("No elements less than 3"));

或者这个

    AtomicBoolean b=new AtomicBoolean();
    List<Integer> mappingResult = Stream.of(1,5)
                                        .map(v -> v < 3 ? -v : v)
                                        .peek(v-> {if(v<3) b.set(true);})
                                        .collect(Collectors.toList());
    if(!b.get()){
        throw new InvalidStateException("No elements less than 3");
    }

如果您希望底片仍然是底片,请使用

.map(v -> v>0 && v < 3 ? -v : v)

正如评论所说,您可以进一步改进(我认为评论符合原始要求)

    AtomicBoolean b = new AtomicBoolean();
    List<Integer> mappingResult = Stream.of(1,5)
                                        .map(v -> {
                                            if (v > 0 && v < 3) {
                                                b.set(true);
                                                return -v;
                                            }
                                            return v;
                                        }).collect(Collectors.toList());
    if (!b.get()) {
        throw new InvalidStateException("No elements less than 3");
    }
,

您应该比较inputoutput。如果它们相等,则引发异常。

List<Integer> input = List.of(1,5);
List<Integer> output = input.stream()
    .map(data -> data < 3 ? -data : data)
    .collect(Collectors.toList());
if (output.equals(input))
    throw new RuntimeException();

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...