Tag: java 8

为什么没有IntStream.flatMapToObj()?

我正在尝试做这样的事情: Stream stream = IntStream.of(…) .flatMapToObj(i -> getStreamOfObjects(i)); 不幸的是,即使在Java 9中, IntStream.flatMapToObj()也不存在。 为什么遗漏了? 什么是推荐的解决方法?

当我使用Java 8 Stream.of原始类型时,结果很混乱

byte[] a = {1,2,3}; System.out.println(Stream.of(a).count()); Byte[] b = {1,2,3}; System.out.println(Stream.of(b).count()); 结果是1和3,为什么?

拆分流并从文本文件中放入列表

如何使用流将我从文本文件中读取的所有元素放入ArrayList 中,其中monitoredData类具有以下3个私有变量: private Date startingTime, Date finishTime, String activityLabel ; File Activities.txt文本如下所示: 2011-11-28 02:27:59 2011-11-28 10:18:11 Sleeping 2011-11-28 10:21:24 2011-11-28 10:23:36 Toileting 2011-11-28 10:25:44 2011-11-28 10:33:00 Showering 2011-11-28 10:34:23 2011-11-28 10:43:00 Breakfast 等等…. 前两个字符串由一个空格分隔,然后是2个标签,再一个空格,2个标签。 String fileName = “D:/Tema 5/Activities.txt”; try (Stream stream = Files.lines(Paths.get(fileName))) { list = (ArrayList) stream .map(w -> w.split(“\t\t”)).flatMap(Arrays::stream) // \\s+ .collect(Collectors.toList()); […]

lambda创建后的序列化

我可以使用以下语法序列化lambda : Runnable r = (Runnable & Serializable) () -> System.out.println(“”); try (ObjectOutput oo = new ObjectOutputStream(new ByteArrayOutputStream())) { oo.writeObject(r); } 但是,如果我从客户端代码收到lambda并且没有正确转换,我无法序列化它。 如何在不更改其定义的情况下序列化以下r : Runnable r = () -> System.out.println(“”); 我试图序列化“派生”对象: Runnable r1 = (Runnable & Serializable) r::run; Runnable r2 = (Runnable & Serializable) () -> r.run(); 但在每种情况下, oo.writeObject(rxxx); 失败并出现NotSerializableException 。

带有3个参数的Java8 stream.reduce() – 获得透明度

我编写了这段代码,将一个单词列表缩减为多少单词以’A’开头。 我只是为了学习Java 8而写它,所以我想更好地理解它[免责声明:我意识到这可能不是编写这段代码的最好方法; 这只是为了练习!] 。 Long countOfAWords = results.stream().reduce( 0L, (a, b) -> b.charAt(0) == ‘A’ ? a + 1 : a, Long::sum); 中间参数/ lambda(称为累加器)似乎能够在没有最终’Combiner’参数的情况下减少完整列表。 事实上,Javadoc实际上说: {@code accumulator}函数充当融合映射器和累加器*,它有时比单独的映射和缩减更有效,*例如当知道先前减少的值允许您避免*某些计算时。 [编辑来自作者] –以下陈述是错误的,所以不要让它混淆你; 我只是把它放在这里,所以我不会破坏答案的原始背景。 无论如何,我可以推断累加器必须输出组合器组合的1和0。 我没有从文档中发现这一点特别明显。 我的问题 有没有办法在组合器执行之前查看输出是什么,所以我可以看到组合器组合的1和0的列表? 这将有助于调试更复杂的情况,我相信我最终会遇到这种情况。

Java 8将Map <Integer,List >转换为Map <String,List > with

我有一个Map是一个值列表的映射,但我需要反转它以便 Map<Integer, List> 变 Map<String, List> 比如我有 1 -> { A, B, C } 2 -> { B } 3 -> { A, C } 而且我想看 A -> { 1, 3 } B -> { 1, 2 } C -> { 1, 3 } 在Java 8中是否有更简单的方法来执行此操作,而不是迭代遍历映射条目并创建一个不存在的set条目,并添加到列表等? 我一直认为这很明显,但我无法解决这个问题。 提前致谢

如何在Collectors.toMap合并函数中获取密钥?

在Collectors.toMap()期间找到重复键条目时,将调用合并函数(o1, o2) 。 问题:如何获得导致重复的密钥? String keyvalp = “test=one\ntest2=two\ntest2=three”; Pattern.compile(“\n”) .splitAsStream(keyval) .map(entry -> entry.split(“=”)) .collect(Collectors.toMap( split -> split[0], split -> split[1], (o1, o2) -> { //TODO how to access the key that caused the duplicate? o1 and o2 are the values only //split[0]; //which is the key, cannot be accessed here }, HashMap::new)); 在合并函数内部,我想根据键确定 ,如果我取消映射,或继续并接受这些值。

如何在Java 8中间接运行方法引用?

一般问题是: 使用语法object::aMethod ,是否可以将其转换为MethodHandle等类型作为function接口? 如果不是,如果可能的话,如何在Java 8中间接调用方法引用? 举个例子,假设我们想要一个MethodRefRunner : class MethodRefRunner { static void execute(Object target, WHATTYPE mref, Object… args) { mref.apply(args); } } 它可以用作: MethodRefRunner.execute(o, o::someMethod, someParam) 在上面的代码片段中, WHATTYPE一个选项是java.util.function.Function但限制性很强。 正如这个答案提到的那样,在版本b75之前,有一个java.util.function.Block可用并且可能很方便。 另一方面, WHATTYPE可能以某种方式转换为java.lang.invoke.MethodHandle吗? Java专家注意 :请根据需要优化问题的标题。

从一个长流创建流的流

我想根据Streams的内容将单个Stream拆分为Streams Streams 。 生成的Stream应包含部分原始流的数据。 我的实际应用程序更复杂(它将日志行分组在时间间隔列表中),但我的问题是如何处理流,所以在这里我要问一个简化的例子。 示例问题 我希望能够根据重复的相同数字将Stream拆分为Stream<Stream> ,只留下奇数的流。 例如,以下流包含: {1,1,1,2,2,2,3,6,7,7,1,1} 需要产生包含以下内容的流的流: {{1,1,1},{3},{7,7},{1,1}} 通过使用filter开始(或结束),我可以做出偶数数字: Stream input = …; Straem<Stream> output = input.filter(this::isOdd).someOtherOperation(); 这是不希望的,因为它意味着两次评估每个输入值,这是可以接受的,但我宁愿避免这种情况。 解决方案的想法 我当前的解决方案是迭代流的内容并创建List<List>并将其转换为Stream<Stream> 。 但是这意味着完整的结果保存在内存中(这对我的应用程序来说是不受欢迎的)。 我也认为我可以通过编写从流中读取的自己的Iterator这一点,但我不确定这是如何工作的。 题 如何根据原始Stream的内容将Stream转换为Stream of Stream ,而不是首先将完整结果存储为List of Lists 。

在Java 8中识别stacktrace中的lambdas

我正在尝试使用JProfiler配置使用lambdas的Java应用程序。 我无法识别,探查器将哪个lambda显示为热点: 我很感激任何帮助理解涉及lambdas的堆栈跟踪的格式,如“edu.indiana.soci.spidal.vectorclass.lambda $ PairwiseThread_SecDrv $ 23” 谢谢!