Tag: java 8

Java 8可选asSet()

所以我现在已经使用了Guava的Optional一段时间了,我转向Java 8所以我想使用它的Optional类,但它没有我最喜欢的方法来自Guava,asSet()。 有没有办法用Java 8 Optional来做到这一点,我没有看到。 我喜欢将可选项视为一个集合,所以我可以这样做: for( final User u : getUserOptional().asSet() ) { return u.isPermitted(getPermissionRequired()); } 在某些情况下,避免需要额外的变量。 IE Optional optUser = getUserOptional(); if ( optUser.isPresent() ) { return optUser.get().isPermitted(getPermissionRequired()); } 有没有一种简单的方法可以在Java 8的Optional中复制Guava风格? 谢谢

以并行方式将`BufferedReader`转换为`Stream `

有没有办法从BufferedReader reader接收Stream stream ,这样stream中的每个字符串代表一行reader ,其中附加条件是直接提供stream ( reader读取所有内容之前)? 我想处理stream并行的数据,以便从reader那里获取它们以节省时间。 编辑:我想处理与阅读并行的数据。 我不想并行处理不同的行。 它们应该按顺序处理。 让我们举例说明我希望如何节省时间。 假设我们的reader将向我们展示100行。 读取一行需要2 ms,处理1 ms需要1 ms。 如果我先读取所有行然后处理它们,将需要300毫秒。 我想要做的是:一旦读取一行,我想处理它并且并行读取下一行。 总时间将为201毫秒。 我不喜欢BufferedReader.lines() :据我所知,当我想处理这些行时,读取就开始了。 我们假设我已经有了我的reader但在能够处理第一行之前必须进行预计算。 假设它们花费30毫秒。 在上面的例子中,使用reader.lines()总时间为231毫秒或301毫秒(你能告诉我哪些时间是正确的吗?)。 但是有可能在201毫秒内完成工作,因为预计算可以与读取前15行并行完成。

如何在流中将1个完成的未来分成许多可完成的未来?

例如,我有这样的方法: public CompletableFuture getPage(int i) { … } public CompletableFuture getDocument(int i) { … } public CompletableFuture parseLinks(Document doc) { … } 我的流量: List list = IntStream .range(0, 10) .mapToObj(i -> getPage(i)) // I want method like this: .thenApplyAndSplit(CompletableFuture page -> { List<CompletableFuture> docs = page.getDocsId() .stream() .map(i -> getDocument(i)) .collect(Collectors.toList()); return docs; }) .map(CompletableFuture […]

Java 8中记忆的无限Fibonacci序列

首先,我是一名JavaScript程序员,对Java8很新,并尝试新的function。 由于我专注于JS编码,我实现了自己的JS懒惰函数库来进行概念validation。 https://github.com/kenokabe/spacetime 使用该库,我可以编写无限序列的自然数和Fibonacci ,如下所示: JavaScript的 var spacetime = require(‘./spacetime’); var _ = spacetime.lazy(); var natural = _(function(n) //memoized automatically { return n; // Natural numbers is defined as the `n`th number becomes `n` }); var natural10 = _(natural) .take(10) .compute(function(x) { console.log(x); }); //wrap a recursive function to memoize // must be at the […]

如何使用流在Java 8中按值范围进行分组

以下是一个示例场景: 想象一下,我们有员工记录,如: name, age, salary (in 1000 dollars) a, 20, 50 b, 22, 53 c, 34, 79 等等。 目标是计算不同年龄组的平均工资(例如21至30岁和31至40岁之间等)。 我想用stream来做这件事,我无法理解我需要使用groupingBy来完成这项工作。 我想也许我需要定义某种元组年龄范围。 有任何想法吗?

jstack是否停止使用较新的JDK8版本?

我很惊讶地发现,不知怎的,最近,jstack停止了在更新的JDK 8上工作。我不知道发生了哪个版本,但我得到了: 36649: Unable to open socket file: target process not responding or HotSpot VM not loaded The -F option can be used when the target process is not responding ps -Af|grep 36649 conflue+ 36649 1 62 08:14 ? 00:48:28 /usr/lib/jvm/java-8-oracle/bin/java -Djava.util.logging.config.file=/opt/atlassian/confluence/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms15000m -Xmx15000m -Duser.timezone=UTC -Djava.awt.headless=true -Dconfluence.upgrade.recovery.file.enabled=false -Dmail.smtp.connectiontimeout=10000 -Dmail.smtp.timeout=10000 -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -Djava.awt.headless=true -Xloggc:/opt/atlassian/confluence/logs/gc-2015-07-02_08-14-39.log -XX:+UseGCLogFileRotation […]

是否有可能在java 8中执行一个惰性groupby,返回一个流?

我有一些大型的文本文件,我想通过对其行进行分组来处理。 我尝试使用新的流媒体function,比如 return FileUtils.readLines(…) .parallelStream() .map(…) .collect(groupingBy(pair -> pair[0])); 问题是,AFAIK,这会生成一个Map。 有没有办法像上面那样产生高级代码,例如,一个条目流? 更新 :我正在寻找的是像python的itertools.groupby 。 我的文件已经排序(通过pair [0]),我只想逐个加载组。 我已经有了一个迭代解决方案。 我只是想知道是否有更多的声明方式来做到这一点。 顺便说一句,使用番石榴或其他第三方图书馆不会是一个大问题。

执行parallelStream.forEach(..)时本机java代码中的NullPointerException

我有以下exception(stacktrace): java.lang.NullPointerException at sun.reflect.GeneratedConstructorAccessor171.newInstance(Unknown Source) ~[?:?] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_40] at java.lang.reflect.Constructor.newInstance(Constructor.java:422) ~[?:1.8.0_40] at java.util.concurrent.ForkJoinTask.getThrowableException(ForkJoinTask.java:598) ~[?:1.8.0_40] at java.util.concurrent.ForkJoinTask.reportException(ForkJoinTask.java:677) ~[?:1.8.0_40] at java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:735) ~[?:1.8.0_40] at java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:160) ~[?:1.8.0_40] at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:174) ~[?:1.8.0_40] at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233) ~[?:1.8.0_40] at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) ~[?:1.8.0_40] at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:583) ~[?:1.8.0_40] at com.tradair.tnet.services.trades.TradeService.updateUnrealizedPNL(TradeService.java:173) ~[tnet.jar:5.1.1.0-SNAPSHOT] 从我的TradeService类开始: public void updateUnrealizedPNL(Set orgsToCaluclate, Set orgsToSendUpdate) { orgsToCaluclate.parallelStream().forEach(o -> { pnlService.updateMidPrices(o); Collection allLiveTradesByOrgId = tradesRepository.getAllLiveTradesByOrgId(o.getId()); […]

使用Java Stream从一组集合中收集所有对象

我正在尝试学习Java Streams并尝试从HashSet<SortedSet>获取HashSet 。 HashSet students = getAllStudents(); HashSet<SortedSet> teachersForStudents = students.stream().map(Person::getTeachers).collect(Collectors.toCollection(HashSet::new)); HashSet = //combine teachers and students in one HashSet 我真的希望它将所有教师和所有学生组合在一个HashSet 。 当我收集我的流时,我想我做错了什么?

使用祖父窗口的默认方法

我完全迷失了为什么那不起作用: interface Test { default void doMagic() { System.out.println(“Abracadabra”); } } class TestImpl implements Test { } class SpecialTestImpl extends TestImpl { public void doMagic() { Test.super.doMagic(); // Error: No enclosing instance of the type Test is accessible in scope } } 这是一些奇怪的Eclipse错误消息(它也无法应对Lamdas,所以也许Mars还没有完全准备好Java 8)? 我可以通过让SpecialTestImpl直接实现Test (它产生警告,因为它是不必要的)或覆盖TestImpl的方法(由于相同的原因产生警告)来解决它。 那么为什么我不能调用超级方法呢? 我的猜测是因为如果我能够直接调用Test.super.doMagic() ,那么在TestImpl实现该方法会破坏SpecialTestImpl的API,即使它不应该。 但是,如果我让SpecialTestImpl实现Test并以这种方式调用默认方法,那也是如此。