【问题标题】:Java streams - peek and skipJava 流 - 查看和跳过
【发布时间】:2019-12-13 18:14:18
【问题描述】:

我正在准备考试,但我对偷看感到困惑。演示代码:

Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9)
    .peek(x -> System.out.print("A" + x))
    .skip(6)
    .peek(x -> System.out.print("B" + x))
    .forEach(x -> System.out.println("C" + x));

输出:

A1A2A3A4A5A6A7B7C7
A8B8C8
A9B9C9

有人能解释一下这里发生了什么吗?我所知道的是skip(6) 会跳过前 6 个元素,peek 会在给定时刻打印流的值。

【问题讨论】:

  • 阅读这个问题的答案:stackoverflow.com/questions/54405863/…
  • 顺便说一句,设置这个的人非常卑鄙,他们完全不合逻辑地选择了printprintlns。如果每个语句都是println,这更容易推理。

标签: java java-stream


【解决方案1】:

我认为这个例子过于迟钝。

这实际上是完全相同的问题,但我相信通过输出可以更清楚地了解发生了什么。它为流中的每个项目打印一行。

Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9)
    .peek(x -> System.out.println())                //always prints
    .peek(x -> System.out.print("A" + x + " "))     //always prints
    .skip(6)                                        //"conditional"
    .forEach(x -> System.out.print("B" + x));       //sometimes prints

输出

A1 
A2 
A3 
A4 
A5 
A6 
A7 B7
A8 B8
A9 B9

整数 1 - 6 只能到达skip 操作,将它们放到地板上。他们不允许到达Bskip 就像一道屏障。

允许剩余的物品通过skip“障碍”并到达B

【讨论】:

  • 我认为考试重点部分是“钝的”,以便挑战人参加考试,以更好地衡量他们是否理解正在发生的事情。
  • @Andreas 旨在故意混淆或欺骗学生的试题是糟糕的试题。如果那是目标,那就太愚蠢了。我喜欢给问题制定者更多的信任,并且喜欢相信他们不小心提出了一个糟糕的问题。我认为这个示例评估了对 Java 流的相同理解——这大概是它旨在评估的内容——而不会产生乱码输出。
【解决方案2】:

您打印它的方式有点复杂。恕我直言,在第一个打印语句的开头放置一个换行符更容易看到。


      Stream.of(1, 2, 3, 4, 5, 6).peek(x -> System.out.print("\nA" + x)).skip(
            1).peek(x -> System.out.print("B" + x)).forEach(
                  x -> System.out.print("C" + x));

生产


A1
A2B2C2
A3B3C3
A4B4C4
A5B5C5
A6B6C6

显然是个人喜好。它只显示自己打印的第一个,其余的按应有的顺序显示。

【讨论】:

  • 有点讽刺的是你说它的打印方式很复杂,并发布了一个这样格式的代码示例...... :)
  • 你是对的!当您发表评论时,我正在更改它。
猜你喜欢
  • 1970-01-01
  • 2018-05-28
  • 2020-03-25
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多