我正在探索Java 8源代码,发现代码的这一特定部分非常令人惊讶:
//defined in IntPipeline.java
@Override
public final OptionalInt reduce(IntBinaryOperator op) {
return evaluate(ReduceOps.makeInt(op));
}
@Override
public final OptionalInt max() {
return reduce(Math::max); //this is the gotcha line
}
//defined in Math.java
public static int max(int a, int b) {
return (a >= b) ? a : b;
}
Run Code Online (Sandbox Code Playgroud)
是Math::max
什么样的方法指针?普通static
方法如何转换为IntBinaryOperator
?
我想使用Java 8的流和lambdas将对象列表转换为Map.
这就是我在Java 7及以下版本中编写它的方法.
private Map<String, Choice> nameMap(List<Choice> choices) {
final Map<String, Choice> hashMap = new HashMap<>();
for (final Choice choice : choices) {
hashMap.put(choice.getName(), choice);
}
return hashMap;
}
Run Code Online (Sandbox Code Playgroud)
我可以使用Java 8和Guava轻松完成此任务,但我想知道如何在没有Guava的情况下完成此操作.
在番石榴:
private Map<String, Choice> nameMap(List<Choice> choices) {
return Maps.uniqueIndex(choices, new Function<Choice, String>() {
@Override
public String apply(final Choice input) {
return input.getName();
}
});
}
Run Code Online (Sandbox Code Playgroud)
还有Java 8 lambda的番石榴.
private Map<String, Choice> nameMap(List<Choice> choices) {
return Maps.uniqueIndex(choices, Choice::getName);
}
Run Code Online (Sandbox Code Playgroud) 我想用最新的JavaFX进行一些编程,这需要Java 8.我使用的是IntelliJ 13 CE和Mac OS X 9 Mavericks.我运行了Oracle的Java 8安装程序,文件看起来就像是他们最终的结果
/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk
Run Code Online (Sandbox Code Playgroud)
但以前的版本是
/System/Library/Java/JavaFrameworks/jdk1.6....
Run Code Online (Sandbox Code Playgroud)
不知道为什么最新的安装程序将其放入/Library
而不是/System/Library
(也没有区别).但是/usr/libexec/java_home
找不到1.8,所以我发现的关于如何设置当前java版本的所有帖子都不起作用.我已经尝试添加一个符号链接,使其看起来像1.8在/System/Library...
路径中,但它没有帮助./usr/libexec/java_home -V
仍然只列出旧的Java 1.6.
具有讽刺意味的是,"系统偏好设置"下的"Java"控制面板仅显示Java 1.8!
为什么Oracle的安装程序没有把它放到真正的位置?我该如何解决这个问题?
import java.util.*;
public class Main {
public static void main(String[] args) {
int size = 3;
String[] array = new String[size];
Arrays.fill(array, "");
for(int i = 0; i <= 100; ) {
array[i++%size] += i + " ";
}
for(String element: array) {
System.out.println(element);
}
}
}
Run Code Online (Sandbox Code Playgroud)
1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 73 76 79 …
Run Code Online (Sandbox Code Playgroud) 在Java 8中,Stream.map()
和Stream.flatMap()
方法有什么区别?
在网上搜索,目前尚不清楚Java 8是否支持Android开发.
在我下载/设置Java 8之前,有人可以在任何"官方"文档中指出我说Java 8是否支持Android开发.
由于Java 8允许在名为Default Methods的接口中默认实现方法,因此在何时使用a之间似乎存在混淆abstract class
.
那么什么时候应该使用与默认方法的接口,何时应该使用抽象类?抽象类在这种情况下仍然有用吗?
我刚刚开始使用Java 8 lambdas,我正在尝试实现我在函数式语言中习惯的一些东西.
例如,大多数函数式语言都有某种类型的查找函数,这些函数对序列进行操作,或者列表返回谓词所在的第一个元素true
.我在Java 8中实现这一目标的唯一方法是:
lst.stream()
.filter(x -> x > 5)
.findFirst()
Run Code Online (Sandbox Code Playgroud)
然而这对我来说似乎效率低下,因为过滤器会扫描整个列表,至少根据我的理解(这可能是错误的).有没有更好的办法?