Questions tagged «java-8»

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

6
如何检查Java 8 Stream是否为空?
Stream作为非终端操作,我如何检查a 是否为空,如果不是则抛出异常? 基本上,我正在寻找与下面的代码等效的东西,但是没有在它们之间实现流。特别是,检查不应在终端操作实际消耗流之前进行。 public Stream<Thing> getFilteredThings() { Stream<Thing> stream = getThings().stream() .filter(Thing::isFoo) .filter(Thing::isBar); return nonEmptyStream(stream, () -> { throw new RuntimeException("No foo bar things available") }); } private static <T> Stream<T> nonEmptyStream(Stream<T> stream, Supplier<T> defaultValue) { List<T> list = stream.collect(Collectors.toList()); if (list.isEmpty()) list.add(defaultValue.get()); return list.stream(); }

4
何时使用默认方法初始化接口?
当搜寻通过Java语言规范来回答这个问题,我学到的是 在初始化类之前,必须先初始化其直接超类,但不初始化由该类实现的接口。同样,在初始化接口之前,不会初始化接口的超级接口。 出于我自己的好奇心,我尝试了一下,并且未如预期的那样对接口InterfaceType进行了初始化。 public class Example { public static void main(String[] args) throws Exception { InterfaceType foo = new InterfaceTypeImpl(); foo.method(); } } class InterfaceTypeImpl implements InterfaceType { @Override public void method() { System.out.println("implemented method"); } } class ClassInitializer { static { System.out.println("static initializer"); } } interface InterfaceType { public …


5
为什么Collections.sort使用Mergesort但Arrays.sort不使用?
我正在使用JDK-8(x64)。对于Arrays.sort(原始),我在Java文档中发现了以下内容: 排序算法是Vladimir Yaroslavskiy,Jon Bentley和Joshua Bloch编写的Dual-Pivot Quicksort。 对于Collections.sort(对象),我找到了“ Timsort”: 此实现是一个稳定的,自适应的,迭代的mergesort ...该实现将指定的列表转储到数组中,对数组进行排序,然后遍历列表,从数组中的相应位置重置每个元素。 如果Collections.sort使用数组,为什么不调用Arrays.sort或使用双轴QuickSort?为什么要使用Mergesort?

5
正确使用Optional.ifPresent()
我试图了解Java 8中API 的ifPresent()方法Optional。 我有简单的逻辑: Optional<User> user=... user.ifPresent(doSomethingWithUser(user.get())); 但这会导致编译错误: ifPresent(java.util.functionError:(186, 74) java: 'void' type not allowed here) 我当然可以做这样的事情: if(user.isPresent()) { doSomethingWithUser(user.get()); } 但是,这就像是一张混乱的null支票。 如果我将代码更改为此: user.ifPresent(new Consumer<User>() { @Override public void accept(User user) { doSomethingWithUser(user.get()); } }); 代码变得越来越脏,这让我想到了回到旧null支票。 有任何想法吗?
94 java  lambda  java-8  optional 

6
在Java 8中,为什么ArrayList的默认容量现在为零?
我记得在Java 8之前,默认容量ArrayList是10。 令人惊讶的是,对默认(无效)构造函数的评论仍然是: Constructs an empty list with an initial capacity of ten. 来自ArrayList.java: /** * Shared empty array instance used for default sized empty instances. We * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when * first element is added. */ private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA …
93 java  arraylist  java-8 

15
Java 8 Stream与批处理
我有一个包含项目列表的大文件。 我想创建一批项目,并用这一批发出一个HTTP请求(所有项目都需要作为HTTP请求中的参数)。我可以使用for循环非常轻松地完成此操作,但是作为Java 8爱好者,我想尝试使用Java 8的Stream框架编写此代码(并获得延迟处理的好处)。 例: List<String> batch = new ArrayList<>(BATCH_SIZE); for (int i = 0; i < data.size(); i++) { batch.add(data.get(i)); if (batch.size() == BATCH_SIZE) process(batch); } if (batch.size() > 0) process(batch); 我想做一些事情 lazyFileStream.group(500).map(processBatch).collect(toList()) 最好的方法是什么?


8
Java中default关键字的目的是什么?
Java中的接口类似于类,但是接口的主体只能包含抽象方法,并且final字段(常量)。 最近,我看到一个问题,看起来像这样 interface AnInterface { public default void myMethod() { System.out.println("D"); } } 根据接口定义,只有抽象方法允许。为什么它允许我编译以上代码?default关键字是什么? 另一方面,当我尝试编写下面的代码时,它说 modifier default not allowed here default class MyClass{ } 代替 class MyClass { } 谁能告诉我default关键字的目的?只能在接口内部使用吗?与default(无访问修饰符)有什么区别?

6
HashMap Java 8实现
按照以下链接文档:Java HashMap实现 我对的实现感到困惑HashMap(或更确切地说,是对的增强HashMap)。我的查询是: 首先 static final int TREEIFY_THRESHOLD = 8; static final int UNTREEIFY_THRESHOLD = 6; static final int MIN_TREEIFY_CAPACITY = 64; 为什么以及如何使用这些常量?我想要一些明确的例子。 他们如何通过这种方式获得性能提升? 其次 如果您HashMap在JDK中看到的源代码,则将找到以下静态内部类: static final class TreeNode<K, V> extends java.util.LinkedHashMap.Entry<K, V> { HashMap.TreeNode<K, V> parent; HashMap.TreeNode<K, V> left; HashMap.TreeNode<K, V> right; HashMap.TreeNode<K, V> prev; boolean red; TreeNode(int …

5
从数组流传输时,为什么不能将整数映射到字符串?
这段代码有效(取自Javadoc): List<Integer> numbers = Arrays.asList(1, 2, 3, 4); String commaSeparatedNumbers = numbers.stream() .map(i -> i.toString()) .collect(Collectors.joining(", ")); 这是无法编译的: int[] numbers = {1, 2, 3, 4}; String commaSeparatedNumbers = Arrays.stream(numbers) .map((Integer i) -> i.toString()) .collect(Collectors.joining(", ")); IDEA告诉我,“ lambda表达式中的返回类型字符串不兼容”。 为什么呢 以及如何解决?

3
_(下划线)是保留关键字
我刚刚s在以下lambda表达式中替换为_: s -> Integer.parseInt(s) Eclipse编译器说: '_'不应用作标识符,因为它是源级别1.8以后的保留关键字。 我没有在JLS§3.9词法结构/关键字中找到任何解释。
92 java  lambda  java-8 

6
将Java Future转换为CompletableFuture
Java 8引入 CompletableFuture了可组合的Future的新实现(包括一堆thenXxx方法)。我想专门使用此库,但是我要使用的许多库仅返回非组合库Future实例。 有没有一种方法可以将返回的Future实例包装到内,CompleteableFuture以便我可以编写它?
92 java  java-8  future 

6
使用流通过自定义比较器收集到TreeSet中
在Java 8中,我有一个TreeSet这样的定义: private TreeSet<PositionReport> positionReports = new TreeSet<>(Comparator.comparingLong(PositionReport::getTimestamp)); PositionReport 是一个相当简单的类,定义如下: public static final class PositionReport implements Cloneable { private final long timestamp; private final Position position; public static PositionReport create(long timestamp, Position position) { return new PositionReport(timestamp, position); } private PositionReport(long timestamp, Position position) { this.timestamp = timestamp; this.position = …

1
completablefuture加入vs获得
CompletableFuture.get()和之间有什么区别CompletableFuture.join()? 下面是我的代码: List<String> process() { List<String> messages = Arrays.asList("Msg1", "Msg2", "Msg3", "Msg4", "Msg5", "Msg6", "Msg7", "Msg8", "Msg9", "Msg10", "Msg11", "Msg12"); MessageService messageService = new MessageService(); ExecutorService executor = Executors.newFixedThreadPool(4); List<String> mapResult = new ArrayList<>(); CompletableFuture<?>[] fanoutRequestList = new CompletableFuture[messages.size()]; int count = 0; for (String msg : messages) { CompletableFuture<?> …

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.