在Java 8中,您可以使用方法引用来过滤流,例如:
Stream<String> s = ...;
long emptyStrings = s.filter(String::isEmpty).count();
Run Code Online (Sandbox Code Playgroud)
有没有办法创建一个方法引用,它是对现有方法的否定,即:
long nonEmptyStrings = s.filter(not(String::isEmpty)).count();
Run Code Online (Sandbox Code Playgroud)
我可以创建not
如下所示的方法,但我想知道JDK是否提供了类似的东西.
static <T> Predicate<T> not(Predicate<T> p) { return o -> !p.test(o); }
Run Code Online (Sandbox Code Playgroud) 如果其中一个值为'null' ,Java 8 Collectors.toMap
将抛出一个NullPointerException
.我不明白这种行为,map可以包含null指针作为值而没有任何问题.有没有一个很好的理由为什么值不能为空Collectors.toMap
?
另外,是否有一个很好的Java 8方法来修复它,或者我应该恢复到普通的旧循环?
我的问题的一个例子:
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class Answer {
private int id;
private Boolean answer;
Answer() {
}
Answer(int id, Boolean answer) {
this.id = id;
this.answer = answer;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Boolean getAnswer() {
return answer;
}
public void setAnswer(Boolean answer) {
this.answer = answer;
}
}
public class Main …
Run Code Online (Sandbox Code Playgroud) 是Java并发在实践中是否仍然有效?我想知道本书中描述的想法,概念和实现是否仍然符合最新的Java版本.
我问,因为最新版本是在2006年完成的.
使用外部迭代时,Iterable
我们使用break
或return
来自增强型for-each循环:
for (SomeObject obj : someObjects) {
if (some_condition_met) {
break; // or return obj
}
}
Run Code Online (Sandbox Code Playgroud)
我们如何在Java 8 lambda表达式中使用break
或return
使用内部迭代,如:
someObjects.forEach(obj -> {
//what to do here?
})
Run Code Online (Sandbox Code Playgroud) 据我所知.stream()
,我可以使用链操作.filter()
或使用并行流.但是如果我需要执行小操作(例如,打印列表的元素),它们之间的区别是什么?
collection.stream().forEach(System.out::println);
collection.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud) 如何从Java 8流/ lambdas中抛出CHECKED异常?
换句话说,我想像这样编译代码:
public List<Class> getClasses() throws ClassNotFoundException {
List<Class> classes =
Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String")
.map(className -> Class.forName(className))
.collect(Collectors.toList());
return classes;
}
Run Code Online (Sandbox Code Playgroud)
此代码无法编译,因为Class.forName()
上面的方法抛出ClassNotFoundException
,检查.
请注意我不希望将已检查的异常包装在运行时异常中,而是抛出包装的未经检查的异常.我想抛出已检查的异常本身,而不是向流添加丑陋的try
/ catches
.
Optional
Java 8中引入的类型对于许多开发人员来说是一件新事物.
一个getter方法返回Optional<Foo>
类型代替经典的Foo
一个好习惯吗?假设值可以null
.
我正在查看文档IntStream
,我看到了一种toArray
方法,但没有办法直接进入List<Integer>
当然有一种方法可以将a转换Stream
为List
?
我知道有关于java.util.Date和Joda-Time的问题.但经过一番挖掘后,我找不到关于java.time API(Java 8中新增,JSR 310定义)和Joda-Time之间差异的线程.
我听说Java 8的java.time API比Joda-Time更清洁,可以做得更多.但我找不到比较两者的例子.
在Java 8中,我们有Stream <T>类,它奇怪地有一个方法
Iterator<T> iterator()
Run Code Online (Sandbox Code Playgroud)
所以你会期望它实现接口Iterable <T>,这需要完全这个方法,但事实并非如此.
当我想使用foreach循环遍历Stream时,我必须做类似的事情
public static Iterable<T> getIterable(Stream<T> s) {
return new Iterable<T> {
@Override
public Iterator<T> iterator() {
return s.iterator();
}
};
}
for (T element : getIterable(s)) { ... }
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?
java ×10
java-8 ×10
java-stream ×4
lambda ×2
collections ×1
collectors ×1
concurrency ×1
datetime ×1
foreach ×1
iterable ×1
java-7 ×1
java-time ×1
jodatime ×1
negate ×1
nullable ×1
optional ×1
predicate ×1