Tag: java 8

为什么使用Optional.of over Optional.ofNullable?

在使用Java 8 Optional类时,有两种方法可以将值包装在可选项中。 String foobar = <value or null>; Optional.of(foobar); // May throw NullPointerException Optional.ofNullable(foobar); // Safe from NullPointerException 我明白Optional.ofNullable是使用Optional的唯一安全的方式,但为什么Optional.of存在呢? 为什么不使用Optional.ofNullable并始终保持安全?

Java 8构造函数参考的可怕的性能和大堆的足迹?

我只是在我们的生产环境中有一个相当不愉快的经历,导致OutOfMemoryErrors: heapspace.. 我追溯到我的使用函数中ArrayList::new的问题。 为了validation这实际上是通过一个声明的构造函数( t -> new ArrayList<>() )执行比正常创build更差,我写了下面的小方法: public class TestMain { public static void main(String[] args) { boolean newMethod = false; Map<Integer,List<Integer>> map = new HashMap<>(); int index = 0; while(true){ if (newMethod) { map.computeIfAbsent(index, ArrayList::new).add(index); } else { map.computeIfAbsent(index, i->new ArrayList<>()).add(index); } if (index++ % 100 == 0) { System.out.println("Reached index "+index); […]

Java SE 8是否有对或元组?

我在Java SE 8中玩懒惰的函数操作,我想将索引i map到一个pair / tuple (i, value[i]) ,然后基于第二个value[i]元素进行filter ,最后输出只是指数。 我还必须忍受这个问题: 什么是Java中的C ++ Pair <L,R>的等价物? 在大胆的lambda和stream的新时代? 更新:我提出了一个相当简单的例子,在下面的答案之一中有@dkatzel提供的整洁的解决scheme。 但是,它并没有概括。 因此,让我加一个更一般的例子: package com.example.test; import java.util.ArrayList; import java.util.stream.IntStream; public class Main { public static void main(String[] args) { boolean [][] directed_acyclic_graph = new boolean[][]{ {false, true, false, true, false, true}, {false, false, false, true, false, true}, {false, false, […]

将Java Stream过滤为1并且只有1个元素

我正在尝试使用Java 8 Stream来查找LinkedList元素。 但是,我想保证,过滤条件只有1个匹配。 拿这个代码: public static void main(String[] args) { LinkedList<User> users = new LinkedList<>(); users.add(new User(1, "User1")); users.add(new User(2, "User2")); users.add(new User(3, "User3")); User match = users.stream().filter((user) -> user.getId() == 1).findAny().get(); System.out.println(match.toString()); } static class User { @Override public String toString() { return id + " – " + username; } int id; […]

如何序列化一个lambda?

我如何优雅地序列化一个lambda? 例如,下面的代码会抛出一个NotSerializableException 。 我怎样才能修复它,而不创build一个SerializableRunnable “虚拟”接口? public static void main(String[] args) throws Exception { File file = Files.createTempFile("lambda", "ser").toFile(); try (ObjectOutput oo = new ObjectOutputStream(new FileOutputStream(file))) { Runnable r = () -> System.out.println("Can I be serialized?"); oo.writeObject(r); } try (ObjectInput oi = new ObjectInputStream(new FileInputStream(file))) { Runnable r = (Runnable) oi.readObject(); r.run(); } }

在Java 8中,带有2个箭头的lambda是什么意思?

我已经阅读过几个Java 8教程。 现在我遇到了以下主题: java是否支持Currying? 在这里,我看到下面的代码: IntFunction<IntUnaryOperator> curriedAdd = a -> b -> a + b; System.out.println(curriedAdd.apply(1).applyAsInt(12)); 我明白这个例子总结了2个元素,但我不明白这个构造: a -> b -> a + b; 根据expression式的左边部分,该行应该执行以下function: R apply(int value); 在此之前,我只能用一个箭头认识lambda。

使用Stream / Map-Reduce / Collector的Java8:HashMap <X,Y>到HashMap <X,Z>

我知道如何从Y – > Z “转换”一个简单的Java List ,即: List<String> x; List<Integer> y = x.stream() .map(s -> Integer.parseInt(s)) .collect(Collectors.toList()); 现在我想用一个Map来做基本相同的事情,即: INPUT: { "key1" -> "41", // "41" and "42" "key2" -> "42 // are Strings } OUTPUT: { "key1" -> 41, // 41 and 42 "key2" -> 42 // are Integers } 解决scheme不应该限于String – > Integer 。 […]

在使用Maven时如何解决更严格的Java 8 Javadoc

您将很快意识到,对于Javadoc,JDK8更严格(默认情况下)。 ( 链接 – 见最后一点) 如果你从来没有生成任何Javadoc,那么当然你不会遇到任何问题,但像Maven发布过程和可能你的CI构build会突然失败,他们在JDK7中工作得很好。 任何检查Javadoc工具出口值的东西现在都会失败。 与JDK7相比,JDK8 Javadoc在warnings方面可能也更加冗长,但这不在此处。 我们在谈论errors ! 这个问题是为了收集如何处理这个问题的build议。 什么是最好的方法? 这些错误是否应该在源代码文件中一劳永逸地解决? 如果你有一个庞大的代码库,这可能是很多工作。 还有什么其他的select? 你也欢迎评论现在失败的事情。 现在失败的恐怖故事 wsimport工具 wsimport工具是创buildWeb服务使用者的代码生成器。 它包含在JDK中。 即使使用JDK8中的wsimport工具,它也会产生无法使用JDK8中的javadoc编译器编译的源代码。 @author标签 我打开3-4年的源代码文件,看到这个: /** * My very best class * @author John <john.doe@mine.com> */ 现在由于<字符而失败。 严格来说这是有道理的,但不是很宽容。 HTML表格 你的Javadoc中的HTML表? 考虑这个有效的HTML: /** * * <table> * <tr> * <td>Col1</td><td>Col2</td><td>Col3</td> * </tr> * </table> */ 这现在失败,错误消息no summary […]

Java三元运算符与if / else <JDK8兼容性

最近我正在阅读Spring框架的源代码。 我不明白的东西在这里: public Member getMember() { // NOTE: no ternary expression to retain JDK <8 compatibility even when using // the JDK 8 compiler (potentially selecting java.lang.reflect.Executable // as common type, with that new base class not available on older JDKs) if (this.method != null) { return this.method; } else { return this.constructor; } } […]

了解Java 8中的Spliterator,Collector和Stream

我无法理解Java 8中的Stream接口,特别是与Spliterator和Collector接口有关的接口。 我的问题是,我简直无法理解Spliterator和Collector接口,结果Stream接口对我来说仍然有些模糊。 Spliterator和Collector究竟是什么,我怎样才能使用它们? 如果我愿意写我自己的Spliterator或Collector (也许是我自己的Stream在这个过程中),我该怎么做,而不是做什么? 我阅读了一些散布在networking上的例子,但由于这里的一切都是新的,可能会有所变化,示例和教程仍然非常稀less。