lambda表达式允许你通过表达式来代替功能接口。可以代替匿名内部类的使用。
public class Test{
public static void main(String[] args){
//方法一:创建匿名内部类
I1 i1 = new I1() {
@Override
public String getValue(String str) {
return str.toUpperCase();
}
};
//方法二:用Lambda
I1 i1 = (String str) -> {
return str.toUpperCase();
};
i1.getValue("abc");
}}
interface I1{
public String getValue(String str);
}
流 – stream
Java 8 API添加了一个新的抽象称为流:Stream,可以让你以一种声明的方式处理数据。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream是对集合的包装,通常和lambda一起使用。
通常我们在数组或集合的基础上创建stream,stream不会专门存储数据。
2.stream不改变源数据对stream的操作也不会影响到创建它的数组和集合,对于stream的聚合、消费或收集操作只能进行一次,再次操作会报错。
3.stream的延迟执行特性延迟性是指当stream的终结操作执行的时候,前面的中间操作才执行。
当我们操作一个流的时候,一般并不会修改流底层的集合(即使集合是线程安全的),如果遍历的时候删除和添加会抛出ConcurrentModificationException异常,而ls.stream().foreach()的时候调用ls的set方法是可以的(比如ls。set(0,0))是可以修改原来集合的元素,如果集合里存的是引用类型也可以重新set或者直接改变对象里的字段。
由于stream的延迟执行特性,在聚合操作执行前修改数据源是允许的。并且会影响到流里。
//创建流对象:
//方法1:通过Collection接口提供的stream()-串行流或 parallelStream()-并行流 获取流对象
@Test
public void method1(){
ArrayList list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
Stream stream = list.stream();//创建流对象
stream.forEach(System.out ::println);//打印
}
//方法2:通过数组Arrays的静态方法stream()
@Test
public void method2(){
String[] ss = {"张三", "李四", "王五"};
Stream stream2 = Arrays.stream(ss);
stream2.forEach(System.out ::println);
}
//方法3:通过Stream的静态方法of()获取流对象
@Test
public void method3(){
Stream stream3 = Stream.of("张三", "李四", "王五");
stream3.forEach(System.out ::println);
}
//方法4:通过迭代器iterate创建无限流
@Test
public void method4(){
Stream stream = Stream.iterate(1, (i)->i+=100);
stream.limit(5).forEach(System.out:: println);
}
//方法5:通过generate()生成无限流
@Test
public void method5(){
Stream stream = Stream.generate(()->Math.random());
stream.limit(3).forEach(System.out::println);
}
流Stream与Limbda结合:
//需求,过滤filter,并输出
@Test
public void method(){
List stuList = Arrays.asList(
new Student("张三", 28, 4800,Cource.JAVA),
new Student("李四", 36, 7200,Cource.JAVA),
new Student("王五", 19, 9600,Cource.HTML),
new Student("赵六", 42, 6100,Cource.HTML),
new Student("孙七", 23, 9600,Cource.PYTHON));
stuList.stream().filter((Student stu)->{
if(stu.getSalary() >= 5000){
return true;
}
return false;
}).limit(3).forEach(System.out:: println);
}
时间日期类:DateTimeFormatter


