Lambda表达式(第一点和第三点是重点): 1.匿名内部类可以简写为lambda表达式:省略new 和这个方法的定义,保留这个的方法体和参数) 2.注意:如果接口中的方法只有一个参数,则lambda表达式可以省略小括号 3.注意:如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号 此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写 4.注意:Lambda表达式中可以省略参数的类型(下边都省略了参数的类型) 5.只要接口中只有一个抽象函数(抽象方法)就符合函数式接口(可以不用标注@FunctionalInterface)(就可以用此接口来写lambda表达式) 注意:只有一个抽象方法,但是接口包含其他default的非抽象方法也可以写成lambda格式。
一、是匿名内部类简写成lambda表达式的情况:
Runable r=new Runable(){
public void run(){
System.out.println("我");
}
}; Thread t=new Thread?; t.start();
注意:上边三部分代码可以简写成下边两部分: Thread t=new Thread(new Runable(){
public void run(){
System.out.println("我");
}
}); t.start();
注意:因为Runnable是一个函数式接口(接口上标注有@FunctionalInterface注解<或者只有一个抽象方法的接口没标注此注解也可以>)
@FunctionalInterface
public interface Runnable{
public void run();
}
所以上边创建Runnable实现类的匿名内部类可以用lambda表达式书写 (省略new 和run方法的定义,保留run的方法体和参数)
Thread t=new Thread(() -> {
System.out.println("我");
});
t.start();
//如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号 //此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写 //所以可以简写为下边格式: Thread t=new Thread(() -> System.out.println(“我”) ); t.start();
二、自己定义接口并使用接口编写lambda表达式(这个不是重点)
@FunctionalInterface
interface I{
int y(int o);
}
class Test{
public static void main(String[] args) {
I i2=(o)->{return o;};
System.out.println( i2.y(4) );
I i3=o->{return o;};
System.out.println( i2.y(4) );
I i4=o-> o;
System.out.println( i2.y(4) );
}
}
再次练习:
class Test2{
private <T> void test() {
ArrayList<T> list=new ArrayList<>();
list.add("aa"); list.add("bb"); list.add("cc");
Collections.sort(list,new Comparator<T>(){
public int compare(T o1, T o2) {
return -1;
}
});
ArrayList<T> list2=new ArrayList<>();
list2.add("aa"); list2.add("bb"); list2.add("cc");
Collections.sort(list2,(T o1, T o2) -> {
return -1;
});
ArrayList<T> list3=new ArrayList<>();
list3.add("aa"); list3.add("bb"); list3.add("cc");
Collections.sort(list3,(T o1, T o2) -> -1);
}
}
三、Lambda表达式对集合进行遍历 集合.foreach(Consumer对象):
3.1.遍历List集合: 实际Lambda表达式对集合进行遍历和上边语法要求是一样的(都是讲匿名内部类简写成Lambda表达式)
public static void main(String[] args) {
ArrayList<Integer> list=new ArrayList<>();
list.add(80);list.add(93);list.add(78);
list.forEach(new Consumer<Integer>() {
public void accept(Integer element) {
System.out.println(element*10);
}
});
ArrayList<Integer> list2=new ArrayList<>();
list2.add(80);list2.add(93);list2.add(78);
list2.forEach((Integer element) ->{
System.out.println(element*10);
});
ArrayList<Integer> list3=new ArrayList<>();
list3.add(80);list3.add(93);list3.add(78);
list3.forEach(element -> System.out.println(element*10) );
list3.forEach(element -> {
if(element*10>100){
System.out.println(element);
}
});
list3.stream().forEach(element -> {
if(element*10>100){
System.out.println(element);
}
});
Stream<Integer> s=listx.stream().filter(new Predicate<Integer>() {
public boolean test(Integer s) {
return s<20;
}
});
s.forEach(element -> System.out.println(element) );
3.2.lambda表达式中用::格式调用方法(这个不是重点)
public static void main(String[] args){
list3.forEach(element -> System.out.println(element*10) );
list3.forEach(System.out::println);
}
3.3.list.forEach方法调用自定义循环处理器: A.list.forEach方法调用自定义循环处理器:调用ShowC对象中的非静态方法showData()
public class TT {
public static void main(String[] args) {
ArrayList<Integer> list=new ArrayList<>();
list.add(80);list.add(93);list.add(78);
list.forEach(new ShowC()::showData);
}
}
class ShowC{
public void showData(Object obj){
System.out.println(obj.toString()+";");
}
}
B.list.forEach方法调用自定义循环处理器:调用ShowC对象中的静态方法showStaticData()
public class TT {
public static void main(String[] args) {
ArrayList<Integer> list=new ArrayList<>();
list.add(80);list.add(93);list.add(78);
list.forEach(ShowC::showStaticData);
}
}
class ShowC{
public static void showStaticData(Object obj){
System.out.println(obj.toString()+";");
}
}
3.4.遍历Map集合:
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>() {{
put("a", "haha");
put("b", "hahaha");
put("d", "hahe");
put("c", "haheeee");
}};
map.forEach((k, v) -> {
System.out.print("key=" + k);
System.out.print("\t");
System.out.println("value=" + v);
});
}
zhaoYQ(2022-05-07)
进程和线程的区别:
如果西安比作操作系统 每个学校相当一一个进程,每个进程有自己的运行区域//切换进程开销大(电脑开启非常多个进程会很慢)//切换学校 学校里边有多个班级,每个班级相当于一个线程,所有班级共享同一个学校区域(共享进程的内存区域)//切换进程开销相对较小(电脑开启非常多个线程不会很慢)
|