Tag: java 8

序列化的lambda和没有serialVersionUID?

我正在尝试学习序列化如何与Java及其最新版本一起工作。 我正在尝试序列化这样的lambda: Runnable r = (Runnable & Serializable)() -> {System.out.println(“This is a test”);}; 但我注意到我没有关于缺少serialVersionUID变量的警告。 这是正常的吗? 我知道它将在运行时生成,但强烈建议您定义它: https : //docs.oracle.com/javase/8/docs/api/java/io/Serializable.html 如果可序列化类未显式声明serialVersionUID,则序列化运行时将基于类的各个方面计算该类的默认serialVersionUID值,如Java(TM)对象序列化规范中所述。 但是,强烈建议所有可序列化类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类详细信息高度敏感,这些详细信息可能因编译器实现而异,因此在反序列化期间可能会导致意外的InvalidClassExceptions。 因此,为了保证跨不同java编译器实现的一致serialVersionUID值,可序列化类必须声明显式serialVersionUID值。 强烈建议显式serialVersionUID声明尽可能使用private修饰符,因为此类声明仅适用于立即声明的类 – serialVersionUID字段不适用于inheritance成员。 数组类不能声明显式的serialVersionUID,因此它们始终具有默认的计算值,但是对于数组类,不需要匹配serialVersionUID值。 我该怎么办 ? 如何在Lambda中定义它? 谢谢

Java 8:如何使用lambda将列表转换为列表

我正在尝试将列表拆分为列表,其中每个列表的最大大小为4。 我想知道如何使用lambdas做到这一点。 目前我正在这样做的方式如下: List<List> listOfList = new ArrayList(); final int MAX_ROW_LENGTH = 4; int startIndex =0; while(startIndex <= listToSplit.size() ) { int endIndex = ( ( startIndex+MAX_ROW_LENGTH ) < listToSplit.size() ) ? startIndex+MAX_ROW_LENGTH : listToSplit.size(); listOfList.add(new ArrayList(listToSplit.subList(startIndex, endIndex))); startIndex = startIndex+MAX_ROW_LENGTH; } UPDATE 似乎没有一种简单的方法可以使用lambdas来拆分列表。 虽然所有答案都非常受欢迎,但它们也是lambdas不简化事物的一个很好的例子。

Files.write():在文本文件中追加新行

我正在使用下面的代码写入文本文件 String content = “I Love Java”; Files.write(Paths.get(gg), (content + “\n”).getBytes(UTF_8),StandardOpenOption.CREATE,StandardOpenOption.APPEND); 运行3次后,文本将保存到文本中: I Love JavaI Love JavaI Love Java 但是,我希望文本文件中的文本看起来像: I Love Java I Love Java I Love Java 有什么帮助吗?

Java 8 Spliterator(或类似的),如果只有一个值,则返回值

我是singleOrEmpty流操作员的singleOrEmpty粉丝。 它不在std lib中,但我发现它非常有用。 如果流只有一个值,则在Optional返回该值。 如果它没有值或多个值,则返回Optional.empty() 。 Optional value = someList.stream().{singleOrEmpty} [] -> Optional.empty() [1] -> Optional.of(1) [1, 1] -> Optional.empty() etc. 我之前问了一个关于它的问题,而@ThomasJungblut 想出了这个伟大的实现 : public static Optional singleOrEmpty(Stream stream) { return stream.limit(2) .map(Optional::ofNullable) .reduce(Optional.empty(), (a, b) -> a.isPresent() ^ b.isPresent() ? b : Optional.empty()); } 唯一的问题是,你必须把它放在通话的开头 singleOrEmpty(someList.stream().filter(…).map(…)) 而不是顺序结束 someList.stream().filter().map().singleOrEmpty() 这使得它比其他流机制更难阅读。 那么作为这个流处理工具的新手,有没有人知道如何在流转换序列结束时建立一个短路的singleOrEmpty机制呢?

您如何访问已传递给CompletableFuture allOf的已完成期货?

我试图掌握Java 8 CompletableFuture。 我怎样才能将这些人加入到“allOf”之后再归还给他们。 下面的代码不起作用,但让您了解我尝试过的内容。 在javascript ES6中我会这样做 Promise.all([p1, p2]).then(function(persons) { console.log(persons[0]); // p1 return value console.log(persons[1]); // p2 return value }); 到目前为止我在Java方面的努力 public class Person { private final String name; public Person(String name) { this.name = name; } public String getName() { return name; } } @Test public void combinePersons() throws ExecutionException, InterruptedException { CompletableFuture […]

Java 8 stream.collect(… groupingBy(… mapping(… reduction)))减少BinaryOperator的使用

我使用groupingBy , mapping和reducing解决了以下问题的解决方案: 在Java 8中优雅地创建带有对象字段的映射作为对象流的键/值 。 总结的目标是获得一张以年龄为关键的地图和一个人作为一套的爱好。 我提出的解决方案之一(不好,但这不是重点)有一个奇怪的行为。 使用以下列表作为输入: List personList = Arrays.asList( new Person(/* name */ “A”, /* age */ 23, /* hobbies */ asList(“a”)), new Person(“BC”, 24, asList(“b”, “c”)), new Person(“D”, 23, asList(“d”)), new Person(“E”, 23, asList(“e”)) ); 以及以下解决方案: Collector<List, ?, Set> listToSetReducer = Collectors.reducing(new HashSet(), HashSet::new, (strings, strings2) -> { strings.addAll(strings2); return […]

Glassfish服务器不适用于JDK 8

我在使用NetBeans的web项目中使用jdk 8和lambda,但是当它部署到glassfish时它会向我显示以下错误: java.lang.RuntimeException: Uncompilable source code – Erroneous tree type: 这是由包含lambda表达式的代码行引起的。 我尝试更改glassfish设置以使用jdk 8,但我没有让它工作。 有没有办法使它工作?

如何在Java中获得无代理连接?

如何在与URLConnection建立连接时避免通过ProxySelector ,或者如何保证连接不受Java知道的任何代理的影响? 我认为这就是Proxy.NO_PROXY的用途。 引用Javadoc: 代表DIRECT连接的代理设置,基本上告诉协议处理程序不使用任何代理 然而,这样的连接仍将通过ProxySelector。 我不明白吗? 我做了一个小测试来certificate我的观点: public static void main(String[] args) throws MalformedURLException, IOException { ProxySelector.setDefault(new MyProxySelector()); URL url = new URL(“http://foobar.com/x1/x2”); URLConnection connection = url.openConnection(Proxy.NO_PROXY); connection.connect(); } 还有一个虚拟的ProxySelector,除了记录正在发生的事情之外什么都不做: public class MyProxySelector extends ProxySelector { @Override public List select(URI uri) { System.out.println(“MyProxySelector called with URI = ” + uri); return Collections.singletonList(Proxy.NO_PROXY); } @Override […]

Elasticsearch安装:错误’jvm.dll错过’服务器’JVM

下载了elasticsearch并按照此链接中的步骤解压缩后: 在Windows上安装Elastic Search 我收到以下错误: Error: missing ‘server’ JVM at ‘C:\Program Files (x86)\Java\jre1.8.0_131\bin\server\jvm.dll’. Please install or use the JRE or JDK that contains these missing components. 注意:我还必须按照此解决方案的建议安装JDK8 我应该更改.config文件中的内容吗? 也许这一行? # force the server VM (remove on 32-bit client JVMs) -server

具有不同arities的重载方法的方法引用无效

尝试编译表达式Comparator.comparing(String::toLowerCase) ,Java编译器返回错误。 有关更多信息,请参阅以下问题: 为什么Comparator.comparing不能与String :: toLowerCase方法引用一起使用? 我试图尽可能地减少这个问题。 特别是,我已经删除了几乎所有依赖项到其他类。 main方法包含两个方法调用。 第一个语句编译时没有错误,而第二个语句产生错误。 interface Fun { R apply(T t); } public final class Foo { public static void main(String… args) { invoke(Foo::bar); // OK invoke(Foo::baz); // ERROR } private static void invoke(Fun f) { } private String bar() { return null; } private String baz() { return null; […]