Java8-学习笔记【中下级篇】

目录

lambda expressions ()->{}

心得体会 

清空StringBuffer的实例的三种方法

java构造函数的顺序

参考文章

Try-catch-finally的return问题



lambda expressions ()->{}

package com.java8demo.demo01;



/**
 * 学习lambda expressions ()->{}
 */
public class LearnLamdaDemo1 {

    interface Printer{
        void print(String val);
    }

    private static void printSomeThing(String something,Printer printer){
        printer.print(something);
    }

    public static void main(String[] args) {
        LearnLamdaDemo1 learnLamdaDemo1 = new LearnLamdaDemo1();
        String something ="hello lambda";

        Printer printer = new Printer(){
            @Override
            public void print(String val) {
                //控制台打印
                System.out.println("The val is "+val+".");
            }
        };
        //normal .The result is ‘The val is hello lambda.’
        learnLamdaDemo1.printSomeThing(something,printer);
        //lambda .The result is ‘hello lambda’
        LearnLamdaDemo1.printSomeThing(something, toPrint -> System.out.println(toPrint));

        //逐步拆解上面的Lambda,即逐步简化理解lambda
        /**
         * lambda就是接口Printer的匿名实现类的函数等简单实现
         * question问题:该接口有多方法呢?
         */
        Printer printer1 = (String val) -> {
            System.out.println(val);
        };
        //亦可省略方法参数的类型
        Printer printer2 = (val) -> {
            System.out.println(val);
        };
        //还能省略括号,【前提】是只有一个参数
        Printer printer3 = val -> {
            System.out.println(val);
        };
        //还能省略中括号,【前提】是只有一个参数,函数体只有一行
        Printer printer4 = val -> System.out.println(val);
        /**
         * 所以LearnLamdaDemo1.printSomeThing(something, Printer printer4 = val -> System.out.println(val));
         * 最终就是LearnLamdaDemo1.printSomeThing(something, val -> System.out.println(val));
         * 这是程序自身根据context上下文去推断,去实现一个Printer接口的实现类。
         * 下面是个人理解:
         *  LearnLamdaDemo1的printSomeThing(String something,Printer printer){} 该方法就知道参数要传入【Printer接口的实现类printer实例】是啥了。
         *  然后自然就【推断】得出Printer printer4 = val -> System.out.println(val);
         *  最后若没有传入参数,则() -> System.out.println(val);。即{}就是方法。参数->方法。java给你去实现哪个参数被哪些方法调用。
         *  【总结】lambda expressions 就是 ()->{}
         */
    }
    /**
     * 【补充】
     * 你也可以使用@FunctionalInterface去定义这个接口是函数式接口,函数式接口只有一个抽象方法,
     * 且函数式接口可以包含多个default方法,也可以包含多个static方法。
     */
}

心得体会 

/**
         * 所以LearnLamdaDemo1.printSomeThing(something, Printer printer4 = val -> System.out.println(val));
         * 最终就是LearnLamdaDemo1.printSomeThing(something, val -> System.out.println(val));
         * 这是程序自身根据context上下文去推断,去实现一个Printer接口的实现类。
         * 下面是个人理解:
         *  LearnLamdaDemo1的printSomeThing(String something,Printer printer){} 该方法就知道参数要传入【Printer接口的实现类printer实例】是啥了。
         *  然后自然就【推断】得出Printer printer4 = val -> System.out.println(val);
         *  最后若没有传入参数,则() -> System.out.println(val);。即{}就是方法。参数->方法。java给你去实现哪个参数被哪些方法调用。
         *  【总结】lambda expressions 就是 ()->{}
         */

清空StringBuffer的实例的三种方法

@Test
public void testStringbuffer(){
//StringBuffer类没有clear方法,不过可以通过下面两种方法来清空一个StringBuffer的实例:
StringBuffer sb = new StringBuffer();
sb.append(“123”);
sb.append(“345”);
System.out.println(sb.toString());

    

//方法一:使用delete方法
    sb.delete(0,sb.length());
    System.out.println(sb.toString());

//方法二: 使用setLength方法
    sb.append("abc");
    sb.append("def");
    System.out.println(sb.toString());
    sb.setLength(0);
    System.out.println(sb.toString());

//方法三: 新的引用对象,指向一个空
    sb.append("555");
    sb.append("666");
    System.out.println(sb.toString());
    sb = new StringBuffer();
    System.out.println(sb.toString());

java构造函数的顺序

参考文章

this引用逃逸(使用内部类获取未外部类未初始化完的变量),多态父类使用子类未初始化完的变量 - 鸿蒙程序员 - 博客园


Try-catch-finally的return问题

结果是i=5 【catch中的i=3 再29行的i(catch的return无效),再33行i=i+2 再35行i++但是finally的return的表达式对基本数据类型是不起作用的,只起到return的作用

------------------------------------------------------------------------------------------------------------

这样就可以解释为啥是t is 3 finally还是5。因为finally那还是i=3+2;而29行的i还是用的catch里面的3(但是29行的i是新的局部引用了,引用了之前的值)

https://blog.csdn.net/kavensu/article/details/8067850推荐阅读

https://www.cnblogs.com/superFish2016/p/6687549.html推荐阅读

总结以上测试:

1、finally语句总会执行

2、如果try、catch中有return语句,finally中没有return,那么在finally中修改除包装类型和静态变量全局变量以外的数据【我认为就是基本的数据类型】都不会对try、catch中返回的变量有任何的影响(包装类型、静态变量会改变、全局变量

3、尽量不要在finally中使用return语句,如果使用的话,会忽略try、catch中的返回语句(但是try、catch的return的运算都会执行),也会忽略try、catch中的异常,屏蔽了错误的发生

4、finally中避免再次抛出异常,一旦finally中发生异常,代码执行将会抛出finally中的异常信息,try、catch中的异常将被忽略

所以在实际项目中,finally常常是用来关闭流或者数据库资源的,并不额外做其他操作。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值