目录
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常常是用来关闭流或者数据库资源的,并不额外做其他操作。