Questions tagged «stream-processing»

3
为什么要使用“函数操作”而不是for循环?
for (Canvas canvas : list) { } NetBeans建议我使用“功能操作”: list.stream().forEach((canvas) -> { }); 但是,这是为什么首选?如果有的话,很难阅读和理解。您正在调用stream(),然后forEach()使用带参数的lambda表达式canvas。我看不出有什么比for第一个片段中的循环更好。 显然,我只是出于美学目的。也许这里缺少我的技术优势。它是什么?为什么我应该改用第二种方法?

3
使用peek()修改流元素是否是反模式?
假设我有一个事物流,并且想在流中“丰富”它们,我可以使用peek()它,例如: streamOfThings.peek(this::thingMutator).forEach(this::someConsumer); 假设在代码的这一点上对事物进行变异是正确的行为-例如,该thingMutator方法可以将“ lastProcessed”字段设置为当前时间。 但是,peek()在大多数情况下,它的意思是“看起来,但不要碰”。 是使用peek()到发生变异流元素的反模式或不明智的? 编辑: 另一种更常规的方法是转换消费者: private void thingMutator(Thing thing) { thing.setLastProcessed(System.currentTimeMillis()); } 到返回参数的函数: private Thing thingMutator(Thing thing) { thing.setLastProcessed(currentTimeMillis()); return thing; } 并map()改用: stream.map(this::thingMutator)... 但这会引入敷衍的代码(return),但我不认为它会更清晰,因为您知道peek()返回的对象相同,但是map()乍一看并不清楚它是同一类对象。 此外,使用peek()lambda可以突变,但是map()您必须构建火车残骸。比较: stream.peek(t -> t.setLastProcessed(currentTimeMillis())).forEach(...) stream.map(t -> {t.setLastProcessed(currentTimeMillis()); return t;}).forEach(...) 我认为peek()版本更清晰,lambda也很明显是变异的,因此没有“神秘的”副作用。同样,如果使用方法引用,并且该方法的名称明确暗含了突变,则该名称也很明显。 就个人而言,我不会回避使用peek()变异-我觉得这很方便。

4
字节流实际上是什么?
谁能解释我实际上包含什么字节流?它仅包含字节(十六进制数据)或二进制数据还是英文字母?我对“原始数据”一词也感到困惑。如果有人要求我“反转4字节数据”,那么我应该假设数据是十六进制代码还是二进制代码?

3
在通常返回集合的地方返回Streams是理智的事情吗?
在开发与任何旧代码无关的API时,我经常发现自己编写的方法纯粹是通过收集结果终止的Streams管道。像这个: ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() { return myPrivateThingies.stream() .map(this::ownerOfThing) .map(Owner::socialStatus) .filter(SocialStatus::isHeAFineMatey) .collect(MyCustomCollectors.toImmutableSet()); } 现在,此类的大多数客户端通常将需要Collection(在本例中为ImmutableSet)来搜索元素并对其进行迭代,但是某些客户端可能会受益于拥有Stream,因此可以在此基础上传递更多的操作流,而无需从集合中获取新的流。因此,返回Stream会给客户提供他们如果拥有Collection便拥有的选项超集(毕竟,他们总是可以collect()自己拥有Stream: Stream<T> deriveSomethingMeaningfulFromPrivateState() { return myPrivateThingies.stream() .map(this::ownerOfthing) .map(Owner::socialStatus) .filter(SocialStatus::isHeAFineMatey); // No collect } 这种方法对我来说很诱人,因为我看不到它可能存在的任何潜在缺陷。但是,我在任何库中都从未见过这种方法(可能是因为Java 8出现后没有发布太多的库),所以我有点害怕采用它。现有的库类通常在从私有状态派生出某些东西时返回Collections。 如果我决定在Java-8之前的我自己会返回Collection的任何地方返回Stream ,会发生什么不好的事情?还是我可能在这里做一些反模式的事情,而这一切都源于私人国家?

2
传统消息代理和流数据
根据Kafka网站: “ Kakfa用于构建实时数据管道和流应用程序。 ” 在广泛的互联网上搜索,我发现以下“ 流数据 ”是什么? 流数据是通过网络从源连续地流到目的地的数据。和 流数据本质上不是原子的,这意味着流的数据流的任何部分都是有意义的和可处理的,与文件的字节相反,除非您拥有全部字节,否则它什么都没有。和 流数据可以随时启动/停止;和 消费者可以随意附加和分离数据流,并只处理他们想要的部分数据 现在,如果我上面所说的任何内容不正确,不完整或完全错误,请先纠正我!假设我或多或少都在轨道上,那么... 现在,我了解了什么是“流数据”,然后,我了解了Kafka和Kinesis在将自己称为具有流数据的应用程序的处理/中介中间件时的含义。但这激起了我的兴趣:可以/应该像传统的消息代理一样,将Kafka或Kinesis之类的“流中间件”用于非流数据吗?反之亦然:是否可以/应该使用RabbitMQ,ActiveMQ,Apollo等传统MQ来传输数据? 让我们以一个示例为例,其中应用程序将发送其后端常量的需要处理的JSON消息,并且处理过程相当复杂(验证,数据转换,过滤,聚合等): 情况1:消息是电影的每一帧;每个视频帧包含一个JSON消息,其中包含帧数据和一些支持的元数据 情况2:消息是时间序列数据,可能是某人的心跳随时间变化的函数。因此,发送了#1表示我在t = 1时的心跳,消息#2包含了我在t = 2时的心跳,依此类推。 情况3:数据是完全不同的,并且按时间或作为任何“数据流”的一部分不相关。可能随着数百名用户导航应用程序的单击按钮并采取措施而引发的审核/安全事件 根据Kafka / Kinesis的结算方式以及我对“流数据”的理解,它们似乎是案例1(连续的视频数据)和案例2(连续的时间序列数据)的明显候选者。但是,我看不出任何原因,如RabbitMQ之类的传统消息代理也无法有效地处理这两种输入。 在案例3中,仅向我们提供了一个已发生的事件,我们需要处理对该事件的反应。所以对我来说,这意味着需要像RabbitMQ这样的传统经纪人。但是,也没有理由不能让Kafka或Kinesis也不能处理事件数据。 因此,基本上,我正在寻求建立一个表述:我有具有Y特征的X数据。我应该使用像Kafka / Kinesis这样的流处理器来处理它。或者,相反,它可以帮助我确定:我拥有具有Z特征的W数据。我应该使用传统的消息代理来处理它。 因此,我想问:关于数据的哪些因素(或其他因素)有助于指导流处理器或消息代理之间的决策,因为两者都可以处理流数据,并且两者都可以处理(非流)消息数据?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.