标签: java-8

具有多个参数的Java 8 Consumer在哪里?

例如在.Net中,它提供了具有不同数量和类型的参数的Action委托的几个实现(相当于Java Consumer功能接口),我期望Java 8提供了一些方法来指定Consumer不同类型的多个参数.

我知道在Java中我们不能定义具有相同名称的不同类型,这些类型在泛型类型参数中有所不同,但是提供多参数会有很好的流畅替代方案Consumer.

有没有简单的方法可以做到这一点,这不需要定义新的功能界面?

c# java lambda java-8 java-stream

36
推荐指数
3
解决办法
2万
查看次数

如何在Java FX工具栏中右键对齐按钮

我正在使用Java FX场景构建器构建UI,我希望工具栏中的按钮向工具栏的右侧浮动.我已经尝试更改父(工具栏)和按钮的节点方向,但似乎都被忽略.

java javafx java-8 scenebuilder javafx-8

36
推荐指数
1
解决办法
2万
查看次数

从对象列表Java 8获取具有max date属性的对象

我有一类称为Contact具有Date lastUpdated;可变的.

我想拉出Contact一个List<Contact>有max lastUpdated变量的东西.

我知道这可以通过编写自定义比较器并使用来完成Collections.max,但我想知道是否有一种方法可以在Java 8中完成,不需要使用自定义比较器,因为我只想用一个我的代码中只有一个位置的最大日期,并且Contact该类不应始终使用该lastUpdated变量来比较实例.

java collections java-8

36
推荐指数
3
解决办法
5万
查看次数

Java 8中新引入的Arrays.parallelPrefix(...)如何工作?

我遇到了Java 8中引入的Arrays.parallelPrefix.

此重载方法以累积方式对输入数组的每个元素执行操作.例如来自docs:

使用提供的函数并行地累积给定数组的每个元素.例如,如果数组最初保持[2,1,0,3]并且操作执行加法,则在返回时数组保持[2,3,3,6].对于大型数组,并行前缀计算通常比顺序循环更有效.

那么,parallel当一个术语的操作依赖于前一个术语的操作结果时,Java如何实现这个任务,等等?

我尝试自己完成代码并且他们确实使用了ForkJoinTasks,但是它们如何合并结果以获得最终数组并不是那么简单.

java arrays java-8

36
推荐指数
2
解决办法
1518
查看次数

Java的lambda语法有什么细分?

请解释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)

java syntax lambda java-8

35
推荐指数
3
解决办法
7277
查看次数

可以显式删除lambda的序列化支持

由于已经知道它很容易地添加序列化支持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)

java lambda serialization java-8

35
推荐指数
1
解决办法
2423
查看次数

Lambda引用字段

我想知道如何获得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)

java lambda java-8

35
推荐指数
2
解决办法
9411
查看次数

所选目录不是JDK的有效主页 - Ubuntu上的Intellij IDEA

在我的14.04 Ubuntu系统上安装了Intellij Idea 14和OracleJDK 1.8 u25(64位)之后,我无法将Java SDK配置为使用任何JDK.当我导航到模块设置 - > SDK并单击配置SDK,添加按钮,然后/usr/java/jdk1.8.0_25在对话框中选择时,我收到一条错误弹出窗口,指出"所选目录不是JDK的有效主页".

我检查了目录,其中包含的内容bin与文件夹都javajavac内,一个lib文件夹,一个jre文件夹.

我已经尝试依次选择每一个,无济于事,这是我所期待的.

java ubuntu intellij-idea java-8 intellij-13

35
推荐指数
3
解决办法
5万
查看次数

为什么Java 8泛型类型推断选择了这个重载?

考虑以下程序:

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一致.这是预期的,但我仍然觉得需要验证.

java generics language-lawyer java-8

35
推荐指数
2
解决办法
6211
查看次数

如何将字符串与新的1.8流API连接起来

假设我们有一个简单的方法,它应该连接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 java-8 java-stream

35
推荐指数
1
解决办法
1万
查看次数