如何解决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");
}
,
您应该比较input
和output
。如果它们相等,则引发异常。
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();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。