@TOP(上课笔记)
1.授课内容
接口有变化
lambda表达式;λ
流编程:Stream;
2.Why
2.1.Jdk1.8
新功能
3.介绍
3.1.接口
方法五要素:
修饰符,
返回值
方法名
参数
方法体
啥是抽象方法:抽象方法是一个特殊的方法;
木有方法体
被abstract修饰
啥是类
属性
方法
啥是抽象类:抽象是一个特殊的类
对属性木有要求
至少有0个抽象方法;
如果此类有一个方法是抽象的,此类必须抽象类
类被abstract修饰
不能new
啥是接口;接口是一个特殊的抽象类
接口里面的方法全部是抽象的,
属性全部是:public static final;
标准
三流的公司卖服务,二流的公司写实现,一流的公司写接口
标准:
属性可以是不变,是标准,
所有实现类的方法也是一样的
新特性:
接口里面的方法可以有方法体:就不再是抽象的方法;
如何调用普通方法呢?
New对象,对象.方法();
Static修饰的,直接使用类名.方法名();
3.2.Lambda表达式–λ
完全是被,js,scala,python给逼出来的;
木有lambda表达式,是如何做的;匿名类;
Java的开发
创建一个类
继承父类和接口
定义属性和方法
New对象
调用属性和方法
方法的参数类型;有两大类,11小类;(基本数据类型和引用类型)
疑问:为啥方法的参数不能是方法呢?
参数的方法要执行,方法本身也要执行;
Lambda:
方法的参数得是接口;调用接口中的方法
接口的注解;(注解!=注释);@必须是;@FunctionalInterface
接口中的方法只能有一个是抽象的
方法的五要素;方法的参数是方法
/* 方法的定义 /
Public void aa(IAnimal a)
{
Asdflka sflkda sjlfdk askdfj afd
}
/ 方法的调用
参数是接口,目的也是执行接口中的方法,默认执行抽象的方法(只能有一个)
/
对象名/类名.aa((接口中抽象方法的实参列表–A) ->
{
/ 方法体 */
Return 返回值的值(类型要匹配啊
});
注意
如果A的参数列表只有一个,类型可以省略,(自动推断),小括号也可以省略
如果方法体只有一行,大括号可以省略;
返回值,return 也可以省略;(new)
new Thread(() -> System.out.println("=lambda测试==")).start();
接口的类型要分类
所有分类的lambda都在java.util.function
接口名 方法 说明
Supplier get 返回值和类定义时的泛型一样
Consumer accept 接收类定义时的泛型;处理,不需要返回值
Function apply 定义中接收第一个泛型,返回第二个泛型
Predicate test 判断一个(断言)接口定义时泛型是否符合要求
3.3.数据流–stream
懒:能往后拖就往后拖;
如果数据源要是静止不变的,懒与不懒木有区别
如果数据源是经常发年变化的,先攒一攒;
攒到一定程度再一块执行;
2秒,1秒;
spark中的stream;
方法分为两类
返回值是它自已Stream;transformation算子;(懒)
返回值是非Stream;action算子(如果碰到了action算子,必须执行)
4.实战
4.1.接口
动物接口
package com.jinghangzz.news.inter;
import java.util.function.Supplier;
/**
接口
动物
@author Administrator
/
public interface IAnimal
{
/ public static final */
/*public static final int headNum = 1 ; */
int headNum = 1;
/**
/**
/**
/**
人实现类
package com.jinghangzz.news.inter;
/**
人
@author Administrator
*/
public class Person implements IAnimal
{
@Override
public void run()
{
System.out.println("=Personrun");
}
@Override
public void def_eat()
{
System.out.println("=Persondef_eat");
}
}
狗实现类
package com.jinghangzz.news.inter;
/**
*/
public class Dog implements IAnimal
{
@Override
public void run()
{
System.out.println("===Dog=run===");
}
}
测试类
package com.jinghangzz.news.inter;
/**
测试类
~标准的多态;
动物的接口
人和狗的实现类
写了一个多态;父类引用指向子类对象
~jdk1.8里面的方法可以写方法体
普通的方法;在方法返回值的左边加上default
静态的方法;在方法返回值的左边加上static
~如何重写
普通方法和静态方法有方法体,但是不报错;所有的实现类,不用重写default和static方法
普通方法可以被实现类重写;
静态的方法不能被重写
~Supplier:提供者
使用::new调用new方法;
::调用某一个方法;返回值必须是function Interface;
@author Administrator
/
public class ClientMain
{
public static void main(String[] args)
{
System.out.println("==");
/* 父类引用指向子类对象 /
IAnimal animal = new Person();
/ 调用属性 */
System.out.println("=对象.属性=>" + animal.headNum);
System.out.println("–类名(接口).属性名—" + IAnimal.headNum);
/ 调用方法 /
animal.run();
/ 调用普通的方法
* 对象名.方法
* /
animal.def_eat();
/ 静态的方法 */
IAnimal.static_eat();
/* new一个Dog */
Dog dog = new Dog();
/*
* 当调用一个方法或者属性的时候,如何当前类里面有此方法或者属性,就执行;
* 如果当前类里面木有此类或者方法,往上找;
* */
dog.def_eat();
/*IAnimal animal2 = new Dog();*/
/* 提供了一个新特性
* 此写法和上面的写法一样,
* 下面的更装逼
* 调用了new方法 */
IAnimal animal2 = IAnimal.createObj(Dog::new);
System.out.println("---->" + animal2);
/* 返回值必须是@FunctionalInterface */
//String result = IAnimal::static_eat;
}
}
4.2.Lambda
4.2.1.匿名类
多线程实现类
package com.jinghangzz.news.lambda;
import java.util.Date;
/**
import java.util.Date;
/**
缺点:只使用一次;(代码只调用一次)
优点:在哪使用,在哪定义;方便
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.function.Consumer;
import com.jinghangzz.news.inter.IAnimal;
import com.jinghangzz.news.inter.Person;
/**
~初识lambda
方法的参数得是接口;调用接口中的方法
接口的注解;(注解!=注释);@必须是;@FunctionalInterface
接口中的方法只能有一个是抽象的
方法的五要素;方法的参数是方法
@author Administrator
/
public class LambdaMain
{
public static void main(String[] args)
{
/ 多线程
* 参数是:runnable;是接口
* 目的是想调用runnable中的run方法(抽象方法,只有一个)
* lambda语法就是诊对run来定义的
* /
Thread t = new Thread( () ->
{
/ ():run方法的参数
* 方法体指的是run方法的方法体
* 返回值: /
/ 方法体 */
for (int i = 0; i < 10; i++)
{
System.out.println(new Date().toLocaleString() +
“lambda=" + i +">” + Thread.currentThread());
}
});
t.start();
/* 简写为一行 */
new Thread(() -> System.out.println("===lambda测试====")).start();
/* lambda */
List list = Arrays.asList("test1","test2","aaa","test4");
System.out.println("-asList-->" + list);
/* 循环List */
list.forEach(new Consumer()
{
@Override
public void accept(String t)
{
System.out.println("==接口_low==>" + t);
}
});
/* 高大尚 */
list.forEach(e -> System.out.println("==lambda==" + e));
/* 全版:木有简写 */
list.forEach((String e) ->
{
System.out.println("==lambda=全版=" + e);
});
/* Person::new */
/*IAnimal ani = new Person();*/
Person person = (Person) IAnimal.createObj(Person::new);
/* 创建了 List */
List aniList = Arrays.asList(person);
/* 循环:参数是Consumer;它的注解就是funtionInterface */
aniList.forEach(Person::def_eat);
}
}
5.总结