Questions tagged «java-8»

对于2014年3月18日发行的Java平台的第8版(内部版本1.8)特定于Java 8的问题,请使用此标记。在大多数情况下,您还应该指定java标记。

7
迭代Java 8中的枚举
是否可以Enumeration使用Lambda表达式进行迭代?以下代码段的Lambda表示形式是什么: Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); while (nets.hasMoreElements()) { NetworkInterface networkInterface = nets.nextElement(); } 我没有在其中找到任何信息流。

4
Java 8的字符串重复数据删除功能
由于String在Java(与其他语言一样)中由于每个字符占用两个字节而占用大量内存,因此Java 8引入了一项称为String Deduplication的新功能,该功能利用了char数组在字符串和final内部的事实,因此JVM会和他们混在一起。 到目前为止,我已经阅读了这个示例,但是由于我不是专业的Java程序员,因此我很难理解这个概念。 它是这样说的, 已经考虑了多种用于字符串复制的策略,但是现在实现的策略遵循以下方法:每当垃圾收集器访问String对象时,它都会记录char数组。它获取其哈希值并将其与对数组的弱引用一起存储。一旦找到另一个具有相同哈希码的String,便将其逐字符进行比较。如果它们也匹配,则将修改一个String并指向第二个String的char数组。然后,第一个char数组不再被引用,可以被垃圾回收。 这整个过程当然会带来一些开销,但是受到严格的限制。例如,如果一段时间内未发现重复字符串,则将不再检查该字符串。 我的第一个问题 由于该主题是最近在Java 8 update 20中添加的,因此仍然缺少有关该主题的资源,在这里的任何人都可以分享一些有关如何帮助减少StringJava消耗的内存的实际示例吗? 编辑: 上面的链接说, 一旦找到另一个具有相同哈希码的字符串,便将它们逐个字符地进行比较 我的第二个问题 如果两个哈希码String相同,则Strings已经是相同的,那么为什么对它们进行比较char的char,一旦发现,这两个String具有相同的散列码?
73 java  string  java-8 

2
如何使用Java 8 Lambda从流中获取一系列项目?
在上一个问题中[如何在Java 8中动态进行过滤?] Stuart Marks给出了一个很好的答案,并提供了一些有用的实用程序来处理从流中选择topN和topPercent。 我将从他的原始答案中将它们包括在这里: @FunctionalInterface public interface Criterion { Stream<Widget> apply(Stream<Widget> s); } Criterion topN(Comparator<Widget> cmp, long n) { return stream -> stream.sorted(cmp).limit(n); } Criterion topPercent(Comparator<Widget> cmp, double pct) { return stream -> { List<Widget> temp = stream.sorted(cmp).collect(toList()); return temp.stream() .limit((long)(temp.size() * pct)); }; } 我的问题是: [1]如何从具有一定数量的商品的流中获取3到7的热门商品,因此,如果流中有A1,A2 .... A10的商品,则调用 …
73 java  filter  lambda  java-8 

4
Android Studio错误:错误:CreateProcess错误= 216,此版本的%1与您正在运行的Windows版本不兼容
安装了Android Studio 2.2 Preview 2并收到此错误: 错误:CreateProcess错误= 216,此版本的%1与您正在运行的Windows版本不兼容。检查计算机的系统信息,然后与软件发行商联系 屏幕截图: 我重新安装了JDK,仍然是同样的问题。 我什至尝试使用嵌入式JDK,但仍然存在相同的问题:

3
接口方法可以有主体吗?
我知道一个接口就像一个100%纯的抽象类。因此,它不能包含方法实现。但是,我看到了一个奇怪的代码。有人可以解释吗? 代码段: interface Whoa { public static void doStuff() { System.out.println("This is not default implementation"); } } 编辑: 我的IDE是Intellij Idea 13.1。项目SDK是Java 7 <1.7.0_25>。IDE未显示任何编译器错误。但是,当我在命令行编译代码时,我收到以下消息。 Whoa.java:2: error: modifier static not allowed here public static void doStuff() { ^

5
Java 8 Collectors.toMap SortedMap
我正在使用Java 8 lambda,并且想要使用Collectors toMap返回一个SortedMap。我能想到的最好的Collectors toMap方法是使用一个虚拟对象mergeFunction并mapSupplier等于来调用以下方法TreeMap::new。 public static <T, K, U, M extends Map<K, U>> Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier) { BiConsumer<M, T> accumulator = (map, element) -> map.merge(keyMapper.apply(element), valueMapper.apply(element), mergeFunction); return new CollectorImpl<>(mapSupplier, accumulator, …

3
如何比较Java 8的LocalDate实例
我正在编写一个日期需要非常准确的应用程序,我想知道如何比较LocalDate实例。 LocalDate localdate1 = LocalDate().now(); LocalDate localdate2 = someService.getSomeDate(); localdate1.equals(localdate2); 但是我注意到我的应用程序给了我一些令人困惑的结果,并且我认为是因为比较日期。 我正在考虑长时间获取从1970'开始的时间并比较这两个时间,但我一定会更轻松,我敢肯定
72 date  compare  java-8 

3
在Java-8中捕获多个异常
在尝试多捕获功能时,我在自己的m1()方法中发现一切正常。 但是,在m2()同一代码中无法编译。我刚刚更改了语法以减少代码行数。 public class Main { public int m1(boolean bool) { try { if (bool) { throw new Excep1(); } throw new Excep2(); //This m1() is compiling abs fine. } catch (Excep1 | Excep2 e) { return 0; } } public int m2(boolean b) { try { throw b ? …

8
Java 8 Streams可以对集合中的项目进行操作,然后将其删除吗?
像几乎每个人一样,我仍在学习新的Java 8 Streams API的复杂性(并喜欢它们)。我对流的使用有疑问。我将提供一个简化的示例。 Java Streams允许我们采用Collection,并stream()在其上使用方法来接收其所有元素的流。在这,有许多有用的方法,比如filter(),map()和forEach(),这让我们对内容的使用拉姆达操作。 我有看起来像这样的代码(简化): set.stream().filter(item -> item.qualify()) .map(item -> (Qualifier)item).forEach(item -> item.operate()); set.removeIf(item -> item.qualify()); 想法是获取集合中与某个限定符匹配的所有项目的映射,然后对它们进行操作。手术后,它们不再具有任何用途,应从原始设备中取出。该代码运行良好,但是我无法动摇一种感觉,Stream即可以在一行中为我完成操作。 如果在Javadocs中,我可能会忽略它。 有谁更熟悉API,会看到类似的东西吗?


8
Java 8:lambda表达式中的强制检查异常处理。为什么是强制性的而不是可选性的?
我正在使用Java 8的新lambda功能,发现Java 8提供的实践确实很有用。但是,我想知道是否有一种很好的方法来解决以下情况。假设您有一个对象池包装器,需要某种工厂来填充对象池,例如(使用java.lang.functions.Factory): public class JdbcConnectionPool extends ObjectPool<Connection> { public ConnectionPool(int maxConnections, String url) { super(new Factory<Connection>() { @Override public Connection make() { try { return DriverManager.getConnection(url); } catch ( SQLException ex ) { throw new RuntimeException(ex); } } }, maxConnections); } } 将功能接口转换为lambda表达式后,上面的代码变为: public class JdbcConnectionPool extends ObjectPool<Connection> { …

5
为什么在HashMap.clear()中不再使用Arrays.fill()?
我注意到在实施时有些奇怪HashMap.clear()。这就是在OpenJDK 7u40中的样子: public void clear() { modCount++; Arrays.fill(table, null); size = 0; } 这就是从OpenJDK 8u40开始的样子: public void clear() { Node<K,V>[] tab; modCount++; if ((tab = table) != null && size > 0) { size = 0; for (int i = 0; i < tab.length; ++i) tab[i] = null; } } …
70 java  arrays  hashmap  java-8 

5
如何用现代Java比较数组列表的相等性?
我有两个数组列表。 如何在不使用外部库的情况下轻松地将它们与Java 8及其功能的相等性进行比较?我正在寻找一种比这种强力代码(未经测试的代码,可能包含错别字等)更好的(更高级别,更短,更有效)的解决方案: boolean compare(List<String[]> list1, List<String[]> list2) { // tests for nulls etc omitted if(list1.size() != list2.size()) { return false; } for(i=0; i<list1.size(); ++i) { if(!Arrays.equals(list1.get(i), list2.get(i))) { return false; } } return true; } 或者,如果没有更好的方法,那也是一个有效的答案。 奖励:如果Java 9提供了Java 8可以提供的更好的方法,请随时提一下。 编辑:在查看评论并查看此问题如何变得中等热点之后,我认为“更好”应包括在检查数组内容之前首先检查所有数组的长度,因为如果有内部的话,它有可能更快地找到不等式数组很长。
70 java  arrays  list  java-8  equals 

1
年份和年份之间有什么区别?
在DateTimeFormatter类文档定义了不同的符号u为一年,y一年的时代:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns 年份和年份之间有什么区别?
70 java-8  java-time 

3
使用Java 8流将List <Double>相加是否真的需要mapToDouble()?
据我所知,List&lt;Double&gt;使用Java 8流求和的方法是: List&lt;Double&gt; vals = . . . ; double sum = vals.stream().mapToDouble(Double::doubleValue).sum(); 在我mapToDouble(Double::doubleValue)看来,这似乎很不礼貌-只是应该放弃lambda和数据流的样板“仪式”。 最佳实践告诉我们,List实例比数组更可取,但是对于这种求和,数组看起来更干净: double[] vals = . . . ; double sum = Arrays.stream(vals).sum(); 当然,可以做到这一点: List&lt;Double&gt; vals = . . . ; double sum = vals.stream().reduce(0.0, (i,j) -&gt; i+j); 但这reduce(....)比更长sum()。 我知道这与需要围绕Java的非对象原语对流进行改造的方式有关,但是,我在这里还缺少什么吗?有什么方法可以压缩自动装箱以使其更短吗?还是这只是当前的最新状态? 更新-答案摘要 以下是答案的摘要。我在这里进行总结时,我敦促读者自己仔细阅读答案。 @dasblinkenlight解释说,由于Java历史中更进一步的决策,特别是在实现泛型的方式及其与非对象原语的关系方面,总是需要某种类型的拆箱。他指出,从理论上讲,编译器可以进行拆箱操作并允许使用更简短的代码,但这尚未实现。 @Holger显示了一个非常接近我所要表达的解决方案: double sum = …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.