标签: functional-interface

什么时候应该在Java 8中使用Supplier?

这段代码有什么区别?

Supplier<LocalDate> s1 = LocalDate::now;
LocalDate s2 = LocalDate.now();

System.out.println(s1.get()); //2016-10-25
System.out.println(s2); //2016-10-25
Run Code Online (Sandbox Code Playgroud)

我开始学习Java 8中的功能接口,而不了解供应商的好处.究竟何时以及如何使用它们.供应商是否提高了绩效或者提取抽象水平的好处?

谢谢你的回答!这不是重复的问题,因为我使用搜索并没有找到我需要的东西.

更新1: 你的意思是这个?

    Supplier<Long> s1 = System::currentTimeMillis;
    Long s2 = System.currentTimeMillis();

    System.out.println(s1.get()); //1477411877817
    System.out.println(s2); //1477411877817
    try {
        Thread.sleep(3000l);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(s1.get()); //1477411880817 - different
    System.out.println(s2); //1477411877817
Run Code Online (Sandbox Code Playgroud)

java java-8 functional-interface

16
推荐指数
5
解决办法
8645
查看次数

为什么将此Java方法调用视为模棱两可?

我遇到了奇怪的错误消息,我认为这可能是不正确的。考虑以下代码:

public class Overloaded {
    public interface Supplier {
        int get();
    }

    public interface Processor {
        String process(String s);
    }

    public static void load(Supplier s) {}
    public static void load(Processor p) {}

    public static int genuinelyAmbiguous() { return 4; }
    public static String genuinelyAmbiguous(String s) { return "string"; }

    public static int notAmbiguous() { return 4; }
    public static String notAmbiguous(int x, int y) { return "string"; }

    public static int strangelyAmbiguous() { return 4; }
    public static String strangelyAmbiguous(int …
Run Code Online (Sandbox Code Playgroud)

java overloading arity functional-interface method-reference

15
推荐指数
1
解决办法
377
查看次数

警告:[重载]方法m1可能与方法m2不明确

import java.util.function.*;

class Test { 
    void test(int    foo, Consumer<Integer> bar) { }
    void test(long   foo, Consumer<Long>    bar) { }
    void test(float  foo, Consumer<Float>   bar) { }
    void test(double foo, Consumer<Double>  bar) { }
}
Run Code Online (Sandbox Code Playgroud)

当我编译这个时,javac -Xlint Test.java我会得到一些警告:

Test.java:4: warning: [overloads] test(int,Consumer<Integer>) in Test is potentially ambiguous with test(long,Consumer<Long>) in Test
    void test(int    foo, Consumer<Integer> bar) { }
         ^
Test.java:6: warning: [overloads] test(float,Consumer<Float>) in Test is potentially ambiguous with test(double,Consumer<Double>) in Test
    void test(float  foo, Consumer<Float>   bar) { } …
Run Code Online (Sandbox Code Playgroud)

java overloading compiler-warnings java-8 functional-interface

14
推荐指数
1
解决办法
668
查看次数

您是否有Java 8 Functional接口列表(不是java.util.function中列出的接口)?

我试图看看是否有任何方法可以获得Java 8中作为功能接口的所有接口的列表.我不是在谈论这个页面上的列表:

https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

相反,我在谈论像Comparator,FileFilter和Runnable这样的接口--API文档显示的接口是这样的功能:

@FunctionalInterface公共接口Runnable

这些地方有完整的清单吗?

谢谢!

java java-8 functional-interface

13
推荐指数
4
解决办法
4331
查看次数

Java Lambda到比较器转换 - 中间表示

我试图理解Comparator.comparing函数是如何工作的.我创建了自己的比较方法来理解它.

private static <T,U extends Comparable<U>> Comparator<T> comparing(Function<T,U> f) {
    BiFunction<T,T,Integer> bfun = (T a, T b) -> f.apply(a).compareTo(f.apply(b));
    return (Comparator<T>) bfun;
}
Run Code Online (Sandbox Code Playgroud)

此函数的最后一行抛出异常.

但是,如果我将此功能更改为

private static <T,U extends Comparable<U>> Comparator<T> comparing(Function<T,U> f) {
    return (T a, T b) -> f.apply(a).compareTo(f.apply(b));
}
Run Code Online (Sandbox Code Playgroud)

它按预期工作得很好.

第二次尝试使用的中间功能接口是什么,能够将lambda转换为Comparator

java lambda comparator java-8 functional-interface

13
推荐指数
2
解决办法
426
查看次数

Lambda只能用于功能界面吗?

我这样做了:

public class LambdaConflict
{
    public static void main(String args[]){
        //*
        System.out.println(LambdaConflict.get(
            (str) -> "Hello World!! By ME?"
        ));
        /*/
        System.out.println(LambdaConflict.get(new Intf<String> (){
            @Override public String get1(String str){
                return "Hello World!! By get1 " + str;
            }
        }));
        /*****/
    }

    public static String get(Intf<String> i, boolean b){
        return i.get1("from 1");
    }
}

interface Intf<T>
{
    public T get1(T arg1);

    public T get2(T arg1);
}
Run Code Online (Sandbox Code Playgroud)

并获得此异常:

不兼容的类型:Intf不是函数接口在接口Intf中找到的多个非重写抽象方法注意:某些消息已被简化; 使用-Xdiags重新编译:详细以获得完整输出1错误

是否有任何条件我不能使用lambda来替换匿名类?

java lambda java-8 functional-interface

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

为什么不能将@FunctionalInterface应用于SAM抽象基类

我刚刚开始学习Camel,我看到的第一件事就是

    context.addRoutes(new RouteBuilder() {
        public void configure() {
            from("file:data/inbox?noop=true").to("file:data/outbox");
        }
    });
Run Code Online (Sandbox Code Playgroud)

我(合理地恕我直言)尝试替换

    context.addRoutes(()->from("file:data/inbox?noop=true").to("file:data/outbox"));
Run Code Online (Sandbox Code Playgroud)

但那是无效的.

当我挖掘时,我发现lambdas适用于功能接口(如果接口符合条件,则暗示)但@FunctionalInterface注释只能应用于接口(足够公平)并且据我所知,没有抽象类的等效注释.当然,RouteBuilder是一个抽象类.

为什么lambdas仅限于接口?

界面和类之间的本质区别是什么使"功能类"不安全/不可预测/不合理?

我可以理解是否有一些限定符,例如抽象方法必须公开,但我无法解释为什么上述是不合理的.

java-8 functional-interface

12
推荐指数
3
解决办法
1045
查看次数

Java 8 lambdas执行

我怎样才能在Java 8中做这样的事情?

boolean x = ((boolean p)->{return p;}).apply(true);
Run Code Online (Sandbox Code Playgroud)

现在我收到以下错误:

此表达式的目标类型必须是功能接口

java lambda java-8 functional-interface

12
推荐指数
1
解决办法
2695
查看次数

静态引用(带有::)返回接口的方法

我有几个实现相同方法的预定义静态"处理器",例如:

default double process(double num){
Run Code Online (Sandbox Code Playgroud)

样品:

public class Test {
    public static void main(String[] args) {
        test(Test::processor1, 1d);
        test(Test::processor2, 1d);
    }

    static double processor1(double num){
        return num * 10;
    }

    static double processor2(double num){
        return num * 20;
    }
    //...

    static void test(Function<Double, Double> f, double d){
        // Do something util here
        System.out.println(f.apply(d));
    }   
    ...
Run Code Online (Sandbox Code Playgroud)

现在假设我有一些对象可以提供额外的"处理器"列表.

我正在尝试使用a interface来定义那些额外的"处理器".

    static interface IProcessor{
        double process(double num);
    }
Run Code Online (Sandbox Code Playgroud)

使用附加"处理器"实现对象:

    static class SomeObject{
        // Just return one but should be a list...
        static …
Run Code Online (Sandbox Code Playgroud)

java java-8 functional-interface method-reference

12
推荐指数
1
解决办法
1102
查看次数

将Comparable的实例传递给期望Comparator的方法

StreamJava 8中的类定义了一个max需要Comparator参数的方法.这是方法签名:

Optional<T> max(Comparator<? super T> comparator)
Run Code Online (Sandbox Code Playgroud)

Comparator是一个compare具有此签名的抽象方法的功能接口.通知compare需要2个参数.

int compare(T o1, T o2)
Run Code Online (Sandbox Code Playgroud)

Comparable接口具有compareTo带此签名的抽象方法.通知compareTo只需要1个参数.

int compareTo(T o)
Run Code Online (Sandbox Code Playgroud)

在Java 8中,以下代码完美地运行.但是,我期望编译错误,例如"Integer类没有定义compareTo(Integer,Integer)".

int max = Stream.of(0, 4, 1, 5).max(Integer::compareTo).get();
Run Code Online (Sandbox Code Playgroud)

有人可以帮助解释为什么即使他们的方法签名不兼容Comparable,Comparator也可以将实例传递给期望实例的方法?

java comparable comparator java-8 functional-interface

11
推荐指数
1
解决办法
3567
查看次数