【问题标题】:Merging streams with Java 8使用 Java 8 合并流
【发布时间】:2014-12-04 10:18:53
【问题描述】:

在阅读了有关流的信息后,我现在正在尝试使用它们,并且已经通过简单的示例出现了第一个问题。我想实现一个非常简单的加密算法,它使用替换。 有一些文本需要加密:

static List<Integer> text = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
        11, 12, 13, 14, 15, 16, 17, 18, 19, 20);

有一些密码:

private List<Integer> password = Arrays.asList(1, 5, 7, 3);

现在的想法是将密码值添加到文本值中。结果应该是

1+1, 2+5, 3+7, 4+3, 5+1, 6+5, ...

所以我必须从密码创建一个流,当到达上述列表的末尾时,它从头开始。这部分我已经做到了。

现在我必须以某种方式将 2 个流合并为 1 个流。任何想法,如何实现?

【问题讨论】:

    标签: lambda java-8 java-stream


    【解决方案1】:

    我可能会在这里流式传输索引:

    IntStream.range(0, text.size())
             .map(i -> text.get(i) + password.get(i % password.size())
             .toArray();
    

    【讨论】:

    • 我认为您需要先致电boxed(),然后才能收集 IntStream。还是我错了?
    • @Roland:可以,不过你也可以用mapToObj代替map,之后就不用再打电话给boxed()了。或者您使用toArray() 而不是collect(toList()),因为OP 没有指定之后如何处理Stream
    • 这是使用简单的流而不是像下面这样的 for 循环。虽然这是一个函数式表达,但我的真正意图是流式传输大文件的内容以及流式传输密码。尽管该解决方案非常有效,但我想了解是否可以合并流...
    • @micgn 我不确定您打算如何做到这一点 - 您需要并行“迭代”流并在每次到达其末尾时重新创建密码流。我认为没有简单的方法可以做到这一点。
    • 好吧,如果您知道text 的大小,您可以创建一个大小相等的密码流,例如IntStream.rangeClosed(0, text.size()).map(i -&gt; password.get(i%password.size())),或者,如果不是普通的CollectionLongStream.rangeClosed(0, textSize).mapToInt(l -&gt; password.get((int)(l%password.size())))但是,结合这两个流可能会以某种方式起作用,但并不比此处介绍的单流解决方案更好。只有当文本大小或密码大小超过Long.MAX_VALUE 时,我们才需要重新考虑……
    【解决方案2】:

    这些是列表,您的结果也将是一个列表。

    你创建了一个新的 List crypt = new ArrayList();然后循环遍历文本列表,并为文本列表中的每个项目添加密码列表索引中的值,该值是文本列表中的索引 % password.size();

    List<Integer> crypt= new ArrayList<Integer>();
    for(int index= 0;index=<text.size();index++){
        crypt.add(text.get(index)+password.get(index % password.size());
    }
    

    【讨论】:

    • 是的,没错!但我想学习流。当然,它是否会通过流变得更简洁/干净/美丽……
    • 是的,我回答的问题没有抓住重点,但是,有一种观点认为,与其简洁明了,我们不会冒着有点神秘的风险,关于我们在做什么.
    猜你喜欢
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 2015-10-27
    • 2015-08-03
    • 2017-09-26
    相关资源
    最近更新 更多