加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java 8 Lambdas和并发解释

发布时间:2020-12-15 04:31:53 所属栏目:Java 来源:网络整理
导读:我正在阅读Richard Warburton的 Java 8 Lambdas一书中的lambdas.他开始在现代CPU中使用并发性进行讨论,并最终将它与lambdas相关联.我不知道我错过了什么,但我肯定没有得到这个概念.考虑以下课程 class A {private int state;A(){ state = 0;}A(int state){ t
我正在阅读Richard Warburton的 Java 8 Lambdas一书中的lambdas.他开始在现代CPU中使用并发性进行讨论,并最终将它与lambdas相关联.我不知道我错过了什么,但我肯定没有得到这个概念.考虑以下课程

class A {

private int state;

A(){
    state = 0;
}

A(int state){
    this.state = state;
}

public int getState() {
    return state;
}

public void setState(int state) {
    this.state = state;
}

@Override
public String toString() {
    return Integer.toString(state);
}
} // end A

public class Main {

public static void main(String[] args) {

    List<A> ls = new ArrayList<>();

    ls.add(new A(2));
    ls.add(new A(3));

    ls.forEach( a -> a.setState(a.getState() + 1) );
    System.out.println(ls); // [3,4]

} // end main

} // end class Main

如何构造ls.forEach(a – > a.setState(a.getState()1));更适合并发编程而不是

ls.forEach(new Consumer<A>() {

        @Override
        public void accept(A t) {
            t.setState(t.getState() + 1);
        }
    });

解决方法

从开发人员的角度来看,第一个lambda示例只是由java编译器扩展为您提供的第二个代码示例.当且仅当函数的参数需要具有一个未知方法的接口时,Lambdas基本上创建一个匿名内部类.

实际的Java8实现略有不同,因为它们不想生成大量的类文件,因此实现类是在运行时通过在invokedynamic的帮助下绑定私有方法(lambda代码)来创建的.来自Goetz的一些注释还提到运行时可能存在一些缓存优化机会.

从理论上讲,具有库实现知识的优化编译器可以做一些聪明的事情,但这从未像java编译器那样工作,主要是因为java源编译器通常与运行时分离. (invokedynamic部分确实给了一些机会,但没有在库级别)

然而,在风格上使用lambda语法更简洁,也可以被视为更干净的选项,因为您不会想要将变量插入到包含内部类的状态中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读