区块链技术博客
www.b2bchain.cn

使用流替换每次循环 – java程序员分享

本文介绍了使用流替换每次循环 – java程序员分享,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

我想使用Java 8 Streams替换以下for-each循环:

for (Rule rule : this.rules) {      if (rule.getCondition().evaluate(rule, record)) {         Records.emit(collector, outputStreamMapping.get(rule.getOutputStream()), tuple, recordId, record);         collector.ack(tuple);          ruleApplied = true;         break;     } }  if (!ruleApplied) {     LOGGER.warn("No rule was applied to record {}", record);     LOGGER.debug("Rules: {}", this.rules);     ErrorReporter.emitErrorNode(this.collector, recordId, componentName,             "No matching rule for record " + record, record);     collector.fail(tuple); } 

我想遍历一组规则,并评估每个规则的条件。如果条件适用,我将对该记录执行操作并停止处理。如果未应用任何规则,那么我想记录该日志并对记录执行不同的处理。

不过,我不确定如何执行此操作。任何帮助和解释将不胜感激。

编辑:

我已经试过了:

    this.rules.stream().filter(rule -> rule.getCondition().evaluate(rule, record)).forEach((rule) -> {         Records.emit(collector, outputStreamMapping.get(rule.getOutputStream()), tuple, recordId, record);         collector.ack(tuple);          ruleApplied = true;         break;     }); 

当然,它不喜欢break语句,并且还抱怨ruleApplied不是最终的,因为它是在lambda范围之外声明的。

根据我所看到的答案,似乎循环是执行此操作的最干净的方法。我不确定是否还有其他流构造可以允许我以与基本循环不同的方式封装逻辑(即中断和跟踪布尔)。

编辑2:

这是基于该线程的建议的解决方案:

Optional<Rule> possibleRule = rules.stream().filter(rule -> rule.getCondition().evaluate(rule, record))         .findFirst();  if (possibleRule.isPresent()) {     Records.emit(collector, outputStreamMapping.get(possibleRule.get().getOutputStream()), tuple, recordId,             record);     collector.ack(tuple); } else {     LOGGER.warn("No rule was applied to record {}", record);     LOGGER.debug("Rules: {}", this.rules);     ErrorReporter.emitErrorNode(this.collector, recordId, componentName,             "No matching rule for record " + record, record);     collector.fail(tuple); } 

java大神给出的解决方案

你可以做

Optional<Rule> rule = rules.stream().                        .filter(rule -> rule.getCondition().evaluate(rule, record))                        .findFirst(); if (rule.isPresent()) {     Records.emit(collector, outputStreamMapping.get(rule.get().getOutputStream()),                   tuple, recordId, record);     collector.ack(tuple);      ruleApplied = true; } 

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

我有一个Java程序,其中使用的是JTextField,但如果我未指定默认大小,则其宽度为0。我将其插入BorderLayout中,因此如何制作它展开以填充整个容器? java大神给出的解决方案 在上面的示例中,文本字段将正常工作。但是,如果您插入EAST或WEST,则将不起作用。import java.awt.BorderLayout; import ja…

我有一个抽象类,比如AbstractClass和扩展该抽象类的多个其他类(700多个)。 AbstractClass有一个方法,比方说baseMethod(),它不是抽象方法。许多类(500+)覆盖该方法并具有自己的实现。现在,通过eclipse,我可以很容易地看到通过Ctrl+Shift+G覆盖该方法的方法,但是除了手动以外,还有其他方法可以看到不覆盖该方…

我正在尝试将字节数组转换为long,但是接收到BufferUnderflowException ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); byte[] arg1 = new byte[] {0x04, (byte)0xB0}; buffer.put(arg1, 0, arg1.length); …

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 使用流替换每次循环 – java程序员分享
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们