【问题标题】:Java Lambda, Stream and Filter [closed]Java Lambda,流和过滤器[关闭]
【发布时间】:2020-08-13 08:16:54
【问题描述】:

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

创建一个新数组,其中所有小于 3 的元素都将变为负数,而大于等于 3 的所有元素将保持不变。如果没有低于 3 的元素,那么在这种情况下我必须抛出错误。

所以在这种情况下,新数组将是 [ -1, -2, 3, 4, 5]。

如何使用 lambda, filter 来做到这一点?

这是我的一段代码

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();
}

【问题讨论】:

  • 我不想使用 Atomic Interger
  • 但你做到了......
  • 只是一个小观察:在计算中,使用特定和精确的语言很重要,因为小的误解可能会导致大问题。你说你有一个数组,但实际上你有一个 ArrayList。它们是两种不同的东西。当您的意思是“抛出异常”时,您还说“抛出错误”。 Error 是 Throwable 的一个类,它是 not Exception。
  • 没有什么说你必须使用流(假设这不是家庭作业)。仅仅因为流的存在并不意味着它们应该替换程序中的每个循环。如果循环更容易实现、读取和维护,或者如果使用流需要您对抗 API,则使用循环。

标签: java lambda java-stream


【解决方案1】:

这种做你需要的

    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, 2, 3, 4, 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)

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

    AtomicBoolean b = new AtomicBoolean();
    List<Integer> mappingResult = Stream.of(1, 2, 3, 4, 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");
    }

【讨论】:

  • 如果原始列表中包含负数,则变为正数
  • -10, -20, 3, 4, 5 将通过错误...
  • 旁注:peek 不需要执行
  • TBH op 并不关心负面因素,因为他做了完全相同的事情。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-07-18
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多