JDK8 点滴

原文:点击打开链接

jdk8主要从3各方面进行了提升和优化:

开发效率、性能和模块化


开发效率
生产效率方面JDK8主要从以下2个目标提升:
-集合(collections)- 通过对集合扩展,让使用时更加简洁
-注解(annotations)- 加强注解支持,允许在上下文中写注解,现在是不能这样用的(如:primitives)


性能
把Fork/Join框架加到JDK7中,是我们转向多核编程的第一步。JDK8通过提供闭包(lambda表达式)支持的方式将这条路线走的更远了。可能影响较大的就是集合部分吧,闭包再加上新的接口和功能将推使java容器到一个新的层次。除了更加增加可读性和代码的简洁性,lambda表达式还使集合操作能充分利用多核处理器特性。


模块化
社区中最让人感兴趣的一块是 jigsaw 项目:这个项目的目的是为JAVA SE平台设计和实现一个标准模块化的系统,然后把这个系统应用到平台本身和JDK。这里我用了过去式的说法是为了那些我们希望摆脱类路径(环境变量)和类载入器,我们不得不把期待留到JAVA9,至于那个时间点,也会因为 jigsaw 项目而被推迟。

Lambda语法

1lambda是什么? "Lambda表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名, 直接对应于其中的lambda抽象
(lambda abstraction), 是一个匿名函数, 即没有函数名的函数 所以试着使用匿名函数的方式来理解

(params) -> expression //函数名呢?没有!!!
(params) -> statement //函数名呢?没有!!!
(params) -> { statements } //函数名呢?没有!!!

2。 语法是什么?
包含三个部分 一个括号内用逗号分隔的形式参数, 参数是函数式接口里面方法的参数 一个箭头符号: ->
方法体, 可以是表达式和代码块, 方法体函数式接口里面方法的实现, 如果是代码块, 则必须用{}来包裹起来, 且需要一个return 返回值, 但有个例外, 若
函数式接口里面方法返回值是void, 则无需{}

(parameters) -> expression
(parameters) -> { statements; }

Lambda表达式是在JDK 8中开始支持的一种函数式推导语言, 能够大量减少匿名内部类那种冗余的代码。 在Android中, 可以大量使用在设置监听, 设置异
步回调等场景。
Lambda表达式vs匿名类
既然lambda表达式即将正式取代Java代码中的匿名内部类, 那么有必要对二者做一个比较分析。 不同点 一.关键字this。 匿名类的this关键字指向匿名类
lambda表达式的this关键字指向包围lambda表达式的类。 二。 编译方式。 Java编译器将lambda表达式编译成类的私有方法。


3实例
/**
* 测试lambda表达式
* *
@author benhail
*/
public class TestLambda {
 <span style="white-space:pre">	</span>public static void runThreadUseLambda() {
<span style="white-space:pre">		</span>//Runnable是一个函数接口, 只包含了有个无参数的, 返回void的run方法;
<span style="white-space:pre">		</span>//所以lambda表达式左边没有参数, 右边也没有return, 只是单纯的打印一句话
<span style="white-space:pre">		</span>new Thread(() ->System.out.println("lambda实现的线程")).start();
<span style="white-space:pre">		</span>} 
<span style="white-space:pre">	</span>public static void runThreadUseInnerClass() {
<span style="white-space:pre">	</span>//这种方式就不多讲了, 以前旧版本比较常见的做法
<span style="white-space:pre">		</span>new Thread(new Runnable() {
<span style="white-space:pre">		</span>@Override
<span style="white-space:pre">		</span>public void run() {
<span style="white-space:pre">		</span>System.out.println("内部类实现的线程");
<span style="white-space:pre">	</span>}
   }).start();
} 
public static void main(String[] args) {
<span style="white-space:pre">	</span>TestLambda.runThreadUseLambda();
<span style="white-space:pre">	</span>TestLambda.runThreadUseInnerClass();
<span style="white-space:pre">	</span>}
}

4优点:代码简洁且可读

方法引用  : :

1。 方法引用是什么? 是lambda表达式的一个简化写法. 方法引用语法:左边是容器( 可以是类名, 实例名) , 中间是" :: ", 右边是相应的方法名。 如下
所示:
ObjectReference::methodName

一般方法的引用格式是
如果是静态方法, 则是ClassName::methodName。 如 Object ::equals
如果是实例方法, 则是Instance::methodName。 如Object obj=new Object();obj::equals;
构造函数.则是ClassName::new

2。实例
//这里setOnClickListener方法的参数是OnClickListener, 是一个函数式接口
//使用lambda表达式方式
button1.setOnClickListener(v -> { System.out.println("这里是Lambda实现方式"); });
<span style="white-space:pre">	</span>//使用方法引用方式
<span style="white-space:pre">	</span>button2.setOnClickListener(TestMethodReference::doSomething);
} 
public static void doSomething(ActionEvent e) {
<span style="white-space:pre">	</span>System.out.println("这里是方法引用实现方式");
}

内部循环
<span style="white-space:pre">	</span>private static void testForEach() {
      List<Person> list=new ArrayList<Person>();

        //外部循环 for while
        //jdk5.0之前
        for(int i=0;i<5;i++)
        {
            Person p=new Person("person"+i,i);
            list.add(p);
        }
        //jdk5.0
//        for(Person item:list)
//        {
//            item.setAge(18);
//        }

//        for(Person item:list)
//        {
//            System.out.println(item);
//        }
        //jdk8 forEach:jdk为list增加支持内部循环的方法
        list.forEach(item->item.setAge(18));
        //打印集合中的每个元素,其中item是默认一个对象的名称,命名可以自定义
       // list.forEach(item->System.out.println(item));
        //传入一段代码,与lambda一起使用,这里直接省略了单个item对象
        list.forEach(System.out::println);
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值