Java8新特性
为什么学习java8新特性?
1.代码简洁,函数式编程写出的代码简洁且意图明确,⽐如使⽤stream接⼝让你告别for循环。
2.多核友好,Java函数式编程使得编写并⾏程序如此简单,只需要调⽤⼀下parallel()⽅法即可。
什么是lambda表达式?
“->”被称为lambda操作符或者箭头符。----固定语法
他把lambda分为两个部分:
左侧:指定人lambda表达式需要的所有参数------参数,run方法不需要呀参数可以直接写()
右侧:指定了lambda体,即lambda表达式要执行的任务、功能或者说是行为。-----方法体
什么是函数式接口
接口有且只有一个抽象方法
改造成lambda表达式需要满足什么条件
1.可选类型声明:不需要声明参数类型,编译器可以统一识别参数值
list.forEach((x) -> System.out.println(x));
2.可选的参数圆括号();一个参数无需定义圆括号,但是多个参数需要定义圆括号
list.forEach(x-> System.out.println(x));
map.forEach((x,y)-> System.out.println(x+y));
3。可选的大括号{ }:如果主体包含了一个语句,就不需要使用{ }
list.forEach(x-> System.out.println(x));
4.可选的返回关键字return,如果主体只有一个表达式返回值则可以省略return写成和{ }
list.stream().sorted((s1,s2) ->s2.compareTo(s1)).forEach(x-> System.out.println(x));
常见的函数接口
有参数类型的有Consumer(消费型接口),Predicate(断言型接口),Function(函数型接口),
无参数的有Supplier(供货型接口)
Consumer的方法accept()返回值类型void ----- Supplier的方法get() 返回值类型 T ------- Function<T,R>的方法apply()返回值类型R ---- Predicate的方法teat()返回值类型为boolea
方法引用语法
对象名的引用::实例名方法
类名::静态方法名
类名::实例方法名
类名::new(构造器引用)
接⼝冲突
当同时实现的多个接⼝中存在签名⼀样的若⼲个⽅法体实现(⽆论内容是否完全相同)时,实现类必须进⾏覆盖重写以解决冲突。
private static List<String> list = Arrays.asList("c","b","a");
private static Map<String,String> map = new HashMap<>(){
{
this.put("⼿机","⼩⽶");
this.put("笔记本","苹果笔记本");
this.put("⿏标","罗技⿏标");
}
};
public static void main(String[] args) {
//1.可选类型声明:不需要声明参数类型,编译器可以统⼀识别参数值。
list.forEach((x) -> System.out.println(x));
System.out.println("----------");
//2.可选的参数圆括号():⼀个参数⽆需定义圆括号,但多个参数需要定义圆括号()。
list.forEach(x-> System.out.println(x));
map.forEach((x,y)-> System.out.println(x+y));
System.out.println("----------");
//3.可选的⼤括号{}:如果主体包含了⼀个语句,就不需要使⽤{}。
list.forEach(x-> System.out.println(x));
map.forEach((x,y)->{
System.out.println(x);
System.out.println(y);
});
System.out.println("----------");
//4.可选的返回关键字return:如果主体只有⼀个表达式返回值则可以省略return和{}
list.stream().sorted((s1,s2) ->s2.compareTo(s1)).forEach(x-> System.out.println(x));
}
private static Lambda2 lambda2 = new Lambda2();
public static void main(String[] args) {
// lambda2.shop(100, new Consumer<Integer>() {
// @Override
// public void accept(Integer integer) {
// System.out.println("消费了"+integer+"元");
// }
// });
lambda2.shop(100, money -> System.out.println("消费了" + money + "元"));
// lambda2.getCode(5, new Supplier<Integer>() {
// @Override
// public Integer get() {
// return new Random().nextInt(10);
// }
// });
String code = lambda2.getCode(5, () -> new Random().nextInt(10));
System.out.println("code = " + code);
// int asda = lambda2.getStringRealLength("asda", new Function<String, Integer>() {
// @Override
// public Integer apply(String s) {
// int length = s.length();
// return length;
// }
// });
int asda = lambda2.getStringRealLength("asda", s -> s.length());
System.out.println("asda = " + asda);
List<String> list = Arrays.asList("asdasd", "asd", "asd", "a");
List<String> string = lambda2.getString(list, new Predicate<String>() {
@Override
public boolean test(String s) {
return s.length() > 5;
}
});
lambda2.getString(list, s -> s.length() > 5);
System.out.println("string = " + string);
}
//需求1:编写shop⽅法输出消费多少元
public void shop(int money, Consumer<Integer> consumer) {
consumer.accept(money);
}
//需求2:编写getCode⽅法返回指定位数的随机验证码字符串
public String getCode(int num, Supplier<Integer> supplier) {
StringBuilder str = new StringBuilder();
for (int i = 0; i < num; i++) {
str.append(supplier.get());
}
return str.toString();
}
// 需求3:编写getStringRealLength⽅法返回字符串真实⻓度
public int getStringRealLength(String str, Function<String, Integer> function) {
return function.apply(str);
}
// /需求4:编写getString⽅法返回⻓度⼤于5的字符串的集合
public List<String> getString(List<String> list, Predicate<String> predicate) {
ArrayList<String> list1 = new ArrayList<>();
for (String string : list) {
if (predicate.test(string)) {
list1.add(string);
}
}
return list1;
}