gpt4 book ai didi

java - 如何封装 Java Streams 操作

转载 作者:行者123 更新时间:2023-12-01 11:15:47 25 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

去年关闭。




Improve this question




我在使用 Java 时看到的缺点之一 Stream API 是代码与其迭代版本相比似乎不太可读。

顺便说一下,这就是我的想法,但我只是给出了一些背景信息(以避免 the XY problem),我要问的问题与此无关,所以希望这会 不是 被视为基于意见的问题。

封装通常会增加代码的可读性(同样,只是给定上下文)所以我正在寻找封装 Java 的最佳方法 Stream操作。

例如,这是一个简单的系列 Stream操作以典型方式实现(无封装):

    void method1() {
List<Integer> result = IntStream.range(1, 10)

// Two Stream "intermediate" operations:
.filter(i -> i % 2 != 0).map(i -> i * 2)

.boxed().collect(Collectors.toList());

log.debug("Result: {}", result);
// Result: [2, 6, 10, 14, 18]
}

这是我通过添加 filterOutEvenNumbersAndMultiplyByTwo 来实现封装的第一个也是简单的尝试。方法:
    IntStream filterOutEvenNumbersAndMultiplyByTwo(IntStream stream) {
return stream.filter(i -> i % 2 != 0).map(i -> i * 2);
}

void method2() {
List<Integer> result = filterOutEvenNumbersAndMultiplyByTwo(IntStream.range(1, 10))
.boxed().collect(Collectors.toList());

log.debug("Result: {}", result);
// Result: [2, 6, 10, 14, 18]
}

如您所见,我封装了两个中间 Stream新方法中的操作,在这种情况下似乎没有多大意义,但这只是一个例子,可能有两个以上 Stream操作以及更复杂的操作。

新方法提高了可读性(恕我直言)并且可以进行单元测试(这是事实)。
上面的代码有效,但它看起来不太好或干净,理想情况下,我希望能够编写如下内容:
        List<Integer> result = IntStream.range(1, 10)

// This obviously does not compile
.filterOutEvenNumbersAndMultiplyByTwo()

.boxed().collect(Collectors.toList());

我想这是可以完成的,但需要付出很大的努力,因为我必须实现 Stream界面...

还有其他方法吗?
也许存在我可以使用的图书馆?
也许我的 OO 思想正试图强制封装一些不应该的东西,但我仍然想知道它是否可能。

最佳答案

filterOutEvenNumbers只是一个谓词。multiplyByTwo是 map 操作。

// we can unit test these
IntPredicate filterOutEvenNumbers = i -> i % 2 != 0
IntUnaryOperator multiplyByTwo = i -> i * 2;

您可以有 N 个谓词/映射操作。
我们还可以在这里切换各种谓词/映射操作。
IntStream.range(1, 10)
.filter(filterOutEvenNumbers)
.map(multiplyByTwo)
.boxed()
.collect(Collectors.toList());

关于java - 如何封装 Java Streams 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62247764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com