Tag: java stream

选择列表的元素,直到Java 8 Lambdas满足条件

我试图改变主意去思考function方式,最近我遇到了一个情况,我需要从列表中获取元素,直到满足条件,我找不到一种简单的自然方式来实现这一点。 显然我还在学习。 说我有这个清单: List tokens = Arrays.asList(“pick me”, “Pick me”, “pick Me”, “PICK ME”, “pick me and STOP”, “pick me”, “pick me and Stop”, “pick me”); // In a non lambdas was you would do it like below List myTokens = new ArrayList(); for (String token : tokens) { myTokens.add(token); if (token.toUpperCase().endsWith(“STOP”)) { break; } […]

如何使用流对Map中的值求和?

我想要一个与流相当的: public static T getSum(final Map data) { T sum = 0; for (String key: data.keySet()) sum += data.get(key); return sum; } 这段代码实际上并没有编译,因为0不能分配给类型T,但是你明白了。

终止或破坏java 8流循环

我有一个java 8流循环,其中包含以下内容: void matchSellOrder(Market market, Order sellOrder) { System.out.println(“selling ” + market.pair() + ” : ” + sellOrder); market.buyOrders() .stream() .filter(buyOrder -> buyOrder.price >= sellOrder.price) .sorted(BY_ASCENDING_PRICE) .forEach((buyOrder) -> { double tradeVolume = Math.min(buyOrder.quantity, sellOrder.quantity); double price = buyOrder.price; buyOrder.quantity -= tradeVolume; sellOrder.quantity -= tradeVolume; Trade trade = new Trade.Builder(market, price, tradeVolume, Trade.Type.SELL).build(); CommonUtil.convertToJSON(trade); if (sellOrder.quantity […]

Stream方式获取第一个元素匹配的索引boolean

我有一个List 。 我想用特定的用户名获取流中(第一个)用户的索引。 我不希望实际上要求User将.equals()为一些描述User ,只是为了拥有相同的用户名。 我可以想到很难做到这一点(迭代和计数),但感觉应该有一个很好的方法来做到这一点,可能是通过使用Streams。 到目前为止,我所拥有的最好的是: int index = users.stream() .map(user -> user.getName()) .collect(Collectors.toList()) .indexOf(username); 这不是我写过的最糟糕的代码,但它并不好。 它也不是那么灵活,因为它依赖于一个带有.equals()函数的类型的映射函数来描述你正在寻找的属性; 我宁愿有一些可以用于任意Function 谁知道怎么样?

通过项目的属性索引Collection的最干净方法,该项目本身就是一个集合

我有一个List ,想要一个guava Multimap ,我们用它们的Collection getTags()函数的每个标签对Foo分组。 我正在使用java 8,所以lambdas和方法引用很好/鼓励。 例如,如果我有: foo1, tags=a,b,c foo2, tags=c,d foo3, tags=a,c,e 我会得到一个Multimap : a -> foo1, foo3 b -> foo1 c -> foo1, foo2, foo3 d -> foo2 e -> foo3

Java流并行化的可视化

通常,并不十分清楚并行流是如何将输入分成块以及块连接的顺序。 有没有办法可视化任何流源的整个过程,以更好地了解正在发生的事情? 假设我创建了一个这样的流: Stream stream = IntStream.range(0, 100).boxed().parallel(); 我想看到一些树状的结构: [0..99] _____/ \_____ | | [0..49] [50..99] __/ \__ __/ \__ | | | | [0..24] [25..49] [50..74] [75..99] 这意味着整个输入范围[0..99]被分割为[0..49]和[50..99]范围,这些范围又分开。 当然这样的图应该反映Stream API的实际工作,所以如果我用这样的流执行一些实际操作,则应该以相同的方式执行拆分。

为什么原始Stream没有收集(collections家)?

我正在为新手程序员编写一个库,所以我试图保持API尽可能干净。 我的库需要做的一件事就是对大量的int或long进行一些复杂的计算。 我的用户需要从中计算这些值所需的大量场景和业务对象,因此我认为最好的方法是使用流来允许用户将业务对象映射到IntStream或LongStream ,然后计算收集器内的计算。 但是IntStream和LongStream只有3参数collect方法: collect(Supplier supplier, ObjIntConsumer accumulator, BiConsumer combiner) 并且没有Stream具有的简化collect(Collector)方法。 所以不是能够做到的 Collection businessObjs = … MyResult result = businessObjs.stream() .mapToInt( … ) .collect( new MyComplexComputation(…)); 我必须提供这样的供应商,累加器和合并器: MyResult result = businessObjs.stream() .mapToInt( … ) .collect( ()-> new MyComplexComputationBuilder(…), (builder, v)-> builder.add(v), (a,b)-> a.merge(b)) .build(); //prev collect returns Builder object 对于我的新手用户来说这太复杂了,而且非常容易出错。 我的工作是创建以IntStream或LongStream作为输入的静态方法,并为您隐藏收集器的创建和执行 public static MyResult […]

官方文档在哪里说Java的并行流操作使用fork / join?

以下是我对Java 8的Stream框架的理解: 东西创造了一个源流 该实现负责提供BaseStream#parallel()方法,该方法依次返回可以并行运行其操作的Stream。 虽然有人已经找到了一种方法来使用带有Stream框架并行执行的自定义线程池,但我无法在Java 8 API中找到任何提及默认Java 8并行Stream实现将使用ForkJoinPool#commonPool()的内容 。 ( Collection#parallelStream() , StreamSupport类中的方法,以及API中我不知道的其他可能的并行启用流源)。 我只能搜索搜索结果的花絮是: Lambda的状态:图书馆版(“引擎盖下的并行”) 模糊地提到Stream框架和Fork / Join机制。 Fork / Join机器旨在实现此过程的自动化。 JEP 107:集合的批量数据操作 几乎直接声明Collection接口的默认方法#parallelStream()使用Fork / Join实现自身。 但仍然没有关于公共池。 并行实现基于Java 7中引入的java.util.concurrency Fork / Join实现。 因此: Collection#parallelStream() 。 类数组(Javadoc) 直接指出使用公共池的多次。 ForkJoin公共池用于执行任何并行任务。 所以我的问题是: 在哪里说ForkJoinPool#commonPool()用于从Java 8 API获得的流上的并行操作?

Java 8 Stream api:为什么区分顺序和并行执行模式?

来自Stream javadoc : 流管道可以顺序执行或并行执行。 此执行模式是流的属性。 通过初始选择的顺序或并行执行来创建流。 我的假设: 顺序/并行流之间没有function差异。 输出永远不会受执行模式的影响。 由于性能的提高,给定适当数量的内核和问题大小以certificate开销是合并的并行流总是优选的。 我们想编写一次代码并在任何地方运行而不必关心硬件(毕竟这是Java)。 假设这些假设是有效的(一些元假设没有错), 在api中暴露执行模式的价值是什么? 看起来你应该只能声明一个Stream ,并且顺序/并行执行的选择应该在下面的层中自动处理,可以通过库代码或JVM本身作为运行时可用内核的函数来处理,大小问题等 当然,假设并行流也可以在单个核心机器上运行,也许只是总是使用并行流来实现这一点。 但这真的很难看 – 为什么我的代码中的并行流显式引用它是默认选项? 即使存在您故意想要对顺序流进行硬编码的情况 – 为什么不仅仅为此目的使用子接口SequentialStream ,而不是使用执行模式切换来污染Stream ?

Spring MVC中的流JSON输出

我的应用程序是使用Spring boot(1.3.3.RELEASE)和spring mvc,spring data jpa hibernate构建的。 MySql是数据库,Jackson是Json序列化器。 在java 8上。 我想在我的控制器方法中返回一个庞大的数据集。 我想要返回如下所示的对象流,而不是检索所有数据然后传入jackson序列化器。 @RequestMapping(value = “/candidates/all”, method = RequestMethod.GET) public Stream getAllCandidates(){ try { return candidateDao.findAllByCustomQueryAndStream(); } catch(Exception e){ LOG.error(“Exception in getCandidates”,e); } return null; } 我的DAO如下: @Query(“select c from Candidate c”) public Stream findAllByCustomQueryAndStream(); 但是,Jackson正在序列化流对象而不是流的内容。 实际输出如下: {“parallel” : false} 如何指示Jackson序列化内容而不是流对象?