在java8中,接口可以声明default的 也可以声明static了.表示对于接口也可以有直接实现了(抽象类哭晕厕所,表示自己并无卵用了!)
带来的问题
1、子接口和子类优先
2、类比接口优先
3、如果在接口多重实现中遇到了冲突,必须指定调用哪个接口的default方法
lambda表达式在java8之中,把原本需要很多行代码才能实现的东西,改为一行!
不过也是需要有条件的,首先他必须是一个interface,其次 必须有注解@FunctionalInterface
然后! 只能有一个抽象的方法!default和static的方法都可以>=0.
package ojama;
@FunctionalInterface
interface Logic {
boolean logic(int s);
}
public class Test {
public static void main(String[] args) {
// 这里的x表示输入的参数 ->是固定的搭配, ->后面接返回值
Logic logic = x -> 5 < x;
System.out.println(logic.logic(10));
}
}
如上,结果输出的的是true.
这里总结一下我认识的Lambda表达式
// 1. 不需要参数,返回值为 5
() -> 5
// 2. 干2件事
() ->{System.out.print(1);System.out.print(2)}
// 3. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 4. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
再讲解一个经典的栗子.
public class Test {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
// 以前的方法
for (Integer integer : list) {
System.out.println(integer);
}
// 现在的方法
list.forEach(integer -> System.out.println(integer));
}
}
这样对比以前的foreach 代码会简洁很多 //这里可以理解成List接口需要一个参数 你把那个integer当参数穿进去 然后做一些爱做的事.
然后是线程的创建.
public class Test {
public static void main(String[] args) {
//以前启动线程的方式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(123456);
System.out.println(456789);
}
}).start();
//现在启动线程的方式
new Thread(() -> {
System.out.println(123456);
System.out.println(456789);
}).start();
}
}
这里可以看到 Runnable的run方法是没有参数的.所以这个时候 我们写成了(),也就是 实现了@FunctionalInterface注解的接口,因为只有一个抽象方法的缘故,可以自己找他他要实现的方法.你也可以用此方法,将接口创建出来,代码也是如此简洁.
接下来我们看看另一个栗子.
如果我们想知道一个集合中,有多少个隔壁老王 我们应该怎么做呢?
public class Test {
public static void main(String[] args) {
List<Bp> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
if (i % 3 == 0) {
list.add(new Bp(i, "隔壁老王"));
} else {
list.add(new Bp(i, "诚实老李"));
}
}
list.stream().filter(bp -> {
System.out.println("这里有一个隔壁老王");
return bp.getName().equals("隔壁老王");
}).count();
}
}
这里帮我们过滤掉了隔壁老王.然后得到了所有的个数.
注意,Stream只是帮我们进行了处理过滤,如果你有在处理后给他运行代码,他连filter都不会执行,不信的话可以复制上面的代码,看看是否有输出.
如果我要获取一个集合的话 代码如下
public class Test {
public static void main(String[] args) {
List<Bp> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
if (i % 3 == 0) {
list.add(new Bp(i, "隔壁老王"));
} else {
list.add(new Bp(i, "诚实老李"));
}
}
List<Bp> collect = list.stream().filter(bp -> "隔壁老王".equals(bp.getName())).collect(Collectors.toList());
collect.forEach(e -> System.out.println(e.getName()));
}
}
//这里关于集合相关的操作太多了...如果需要还是看文档吧.