例如在.Net中,它提供了具有不同数量和类型的参数的Action委托的几个实现(相当于Java Consumer功能接口),我期望Java 8提供了一些方法来指定Consumer不同类型的多个参数.
我知道在Java中我们不能定义具有相同名称的不同类型,这些类型在泛型类型参数中有所不同,但是提供多参数会有很好的流畅替代方案Consumer.
有没有简单的方法可以做到这一点,这不需要定义新的功能界面?
我正在使用Java FX场景构建器构建UI,我希望工具栏中的按钮向工具栏的右侧浮动.我已经尝试更改父(工具栏)和按钮的节点方向,但似乎都被忽略.
我有一类称为Contact具有Date lastUpdated;可变的.
我想拉出Contact一个List<Contact>有max lastUpdated变量的东西.
我知道这可以通过编写自定义比较器并使用来完成Collections.max,但我想知道是否有一种方法可以在Java 8中完成,不需要使用自定义比较器,因为我只想用一个我的代码中只有一个位置的最大日期,并且Contact该类不应始终使用该lastUpdated变量来比较实例.
我遇到了Java 8中引入的Arrays.parallelPrefix.
此重载方法以累积方式对输入数组的每个元素执行操作.例如来自docs:
使用提供的函数并行地累积给定数组的每个元素.例如,如果数组最初保持[2,1,0,3]并且操作执行加法,则在返回时数组保持[2,3,3,6].对于大型数组,并行前缀计算通常比顺序循环更有效.
那么,parallel当一个术语的操作依赖于前一个术语的操作结果时,Java如何实现这个任务,等等?
我尝试自己完成代码并且他们确实使用了ForkJoinTasks,但是它们如何合并结果以获得最终数组并不是那么简单.
请解释Java 8的lambda方法的语法.
有很多解释了那里什么拉姆达功能,但我找不到语法的详尽的解释,而我发现很难学会正确复制的语法,因为我不明白为什么他们"按原样重写.
这是我遇到的一个常见案例,由NetBeans提供:
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new MainAppJFrame();
});
}
Run Code Online (Sandbox Code Playgroud)
所以,不知何故,以下lambda表达式正在解析为匿名Runnable对象的run()方法:
() -> {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
这->是lambda语法,对吧?花括号只是包含匿名方法代码.括号是否为空参数,因为在这种情况下我们正在创建一个Runnable.run()方法?
这一点对我来说都不太清楚.我假设编译器知道Runnable根据SwingUtilities.invokeLater(Runnable)方法预期的类型实例化匿名?如果有两种SwingUtilities.invokeLater方法仅在参数列表中有所不同,会发生什么?显然在这个特定情况下没有,但在其他地方可能:
interface ExampleLambdaConsumer {
public void doSomething(Runnable r);
public void doSomething(java.lang.reflect.Method m);
}
class C implements ExampleLambdaConsumer {
// implementations for doSomething methods here
public static void main(String[] args) {
doSomething(() -> {
// lambda method body here …Run Code Online (Sandbox Code Playgroud) 由于已经知道它很容易地添加序列化支持lambda表达式时,目标接口已经不继承Serializable,只是喜欢(TargetInterface&Serializable)()->{/*code*/}.
我问,是一种反其道而行之,明确删除支持串行当目标接口不继承Serializable.
由于您无法从类型中删除接口,因此基于语言的解决方案可能看起来像(@NotSerializable TargetInterface)()->{/* code */}.但据我所知,没有这样的解决方案.(纠正我,如果我错了,这将是一个完美的答案)
即使在类实现时拒绝序列化是Serializable过去的合法行为,并且程序员控制下的类,模式看起来如下:
public class NotSupportingSerialization extends SerializableBaseClass {
private void writeObject(java.io.ObjectOutputStream out) throws IOException {
throw new NotSerializableException();
}
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException {
throw new NotSerializableException();
}
private void readObjectNoData() throws ObjectStreamException {
throw new NotSerializableException();
}
}
Run Code Online (Sandbox Code Playgroud)
但是对于lambda表达式,程序员没有对lambda类的控制.
为什么有人会费心去除支持?好吧,除了生成包含Serialization支持的更大代码之外,它还会产生安全风险.请考虑以下代码:
public class CreationSite {
public static void main(String... arg) {
TargetInterface f=CreationSite::privateMethod;
} …Run Code Online (Sandbox Code Playgroud) 我想知道如何获得lambda对字段的引用.我不想使用方法,因为我的字段是公共最终的.我怀疑这是不可能的,但我没有看到明显的陈述.
class A {
public final String id;
...
}
Map<String, A> f(List<A> l) {
return l.stream().collect(Collectors.toMap(A::id, Function.identity()));
}
Run Code Online (Sandbox Code Playgroud) 在我的14.04 Ubuntu系统上安装了Intellij Idea 14和OracleJDK 1.8 u25(64位)之后,我无法将Java SDK配置为使用任何JDK.当我导航到模块设置 - > SDK并单击配置SDK,添加按钮,然后/usr/java/jdk1.8.0_25在对话框中选择时,我收到一条错误弹出窗口,指出"所选目录不是JDK的有效主页".
我检查了目录,其中包含的内容bin与文件夹都java和javac内,一个lib文件夹,一个jre文件夹.
我已经尝试依次选择每一个,无济于事,这是我所期待的.
考虑以下程序:
public class GenericTypeInference {
public static void main(String[] args) {
print(new SillyGenericWrapper().get());
}
private static void print(Object object) {
System.out.println("Object");
}
private static void print(String string) {
System.out.println("String");
}
public static class SillyGenericWrapper {
public <T> T get() {
return null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
它在Java 8下打印"String",在Java 7下打印"Object".
我原以为这是Java 8中的歧义,因为两种重载方法都匹配.为什么编译器print(String)在JEP 101之后选择?
是否合理,这会破坏向后兼容性,并且在编译时无法检测到更改.升级到Java 8后,代码只是偷偷摸摸地表现不同.
注意:由于SillyGenericWrapper某种原因,它被命名为"愚蠢".我试图理解为什么编译器的行为方式,不要告诉我这个愚蠢的包装器首先是一个糟糕的设计.
更新:我还尝试在Java 8下编译和运行示例,但使用的是Java 7语言级别.这种行为与Java 7一致.这是预期的,但我仍然觉得需要验证.
假设我们有一个简单的方法,它应该连接Person集合的所有名称并返回结果字符串.
public String concantAndReturnNames(final Collection<Person> persons) {
String result = "";
for (Person person : persons) {
result += person.getName();
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法用1行的新流API forEach函数编写这段代码?
java ×10
java-8 ×10
lambda ×4
java-stream ×2
arrays ×1
c# ×1
collections ×1
generics ×1
intellij-13 ×1
javafx ×1
javafx-8 ×1
scenebuilder ×1
syntax ×1
ubuntu ×1