相关疑难解决方法(0)

Lambda的行为与匿名内部类不同

在做一些基本的lambda练习时,一个看似相同的匿名内部类的输出给了我一个不同于lambda的输出.

interface Supplier<T> {

    T get(T t);
}
Run Code Online (Sandbox Code Playgroud)

场景#1

Supplier<Integer> s1 = new Supplier<Integer>() {
    @Override
    public Integer get(Integer t) {
        return t;
    }
};
Supplier<Integer> s2 = t -> t;
System.out.println(s1.get(2));
System.out.println(s2.get(2));
Run Code Online (Sandbox Code Playgroud)

输出22.这里没什么新鲜的.


但是当我这样做时:

场景#2

Supplier<Integer> s1 = new Supplier<Integer>() {
    @Override
    public Integer get(Integer t) {
        return t++;
    }
};
Supplier<Integer> s2 = t -> t++;
System.out.println(s1.get(2));
System.out.println(s2.get(2));
Run Code Online (Sandbox Code Playgroud)

输出23

问题:两个输出不应该相同吗?我错过了什么吗?


为了完整起见: 场景#3

Supplier<Integer> s1 = new Supplier<Integer>() {
    @Override
    public Integer …
Run Code Online (Sandbox Code Playgroud)

java lambda anonymous-inner-class java-8

25
推荐指数
1
解决办法
1842
查看次数

使用lambda表达式键入推理限制

虽然Java 8的类型推断看起来有了很大的改进,但我遇到了一个可能的限制,我不确定是否有一些我缺少的解决方法.场景:

class Foo<T> {
  <U> void apply(Function<T, Consumer<U>> bar) {}
}

class Bar {
  void setBar(String bar){}
}

Foo<Bar> foo = new Foo<>();
Run Code Online (Sandbox Code Playgroud)

这有效:

foo.<String>apply(bar -> bar::setBar);
Run Code Online (Sandbox Code Playgroud)

这不是:

foo.apply(bar -> bar::setBar);
Run Code Online (Sandbox Code Playgroud)

有没有办法让类型推断在这种情况下工作?

java lambda type-inference java-8

7
推荐指数
1
解决办法
424
查看次数