一,接口
1.接口中的静态方法:javaSE 8 中,允许在接口中增加静态的方法,目前为止,静态方法都是放在伴随类中,如Collection/Collections,path/paths,这样paths就不需要了,实现自己的接口工具类的时候,就不需要提供额外的实现类了
public interface Path{
public static Path get (String first,String ...more){
return FileSystems.getDefault().getPath(first,more)
}
}
2.接口中的默认方法:default限定,如下,更改接口,''接口演化'',改变接口,增加默认方法,不需要改变他的类都重新去实现
public interface MyInterface {
/**
* 默认方法
* @return
*/
default String getName () {
return "张三";
}
default String getAge () {
return "13";
}
/**
* 普通方法
* @return
*/
String getHome ();
}
默认方法冲突的解决方案:
①.类优先:接口默认方法的”类优先”原则 ,若一个接口中定义了一个默认方法,而另外一个父类或接口中 又定义了一个同名的方法时,先调用类中的同名方法:
新建一个接口MyInterface1.java,里面有个默认实现方法method1.
public interface MyInterface1 {
default void method1() {
System.out.println("MyInterface1中的默认方法");
}
}
再建一个类FatherClass.java,里面同样有一个同名的实现方法method1.
public class FatherClass {
public void method1() {
System.out.println("FatherClass中的方法method1");
}
}
创建一个子类SonClass.java,这个类继承FatherClass.java父类,并且实现MyInterface1接口。
import com.nieshenkuan.inter.MyInterface1;
public class SonClass extends FatherClass implements MyInterface1{
}
测试这个子类创建后,调用method1方法,会调用哪个类或者接口中的实现方法。
@Test
public void test01() {
SonClass sc=new SonClass();
sc.method1();//FatherClass中的方法method1
}
②接口冲突:
如果一个父接口提供一个默认方法,而另一个接 口也提供了一个具有相同名称和参数列表的方法(不管方法 是否是默认方法),那么必须覆盖该方法来解决冲突
public interface MyInterface2 {
default void method1() {
System.out.println("MyInterface2中的默认方法");
}
}
2、新建SonClass2类,实现了 MyInterface1,MyInterface2两个接口,这是会提醒你要实现哪个接口中的默认方法,如下:
import com.nieshenkuan.inter.MyInterface1;
import com.nieshenkuan.inter.MyInterface2;
public class SonClass2 implements MyInterface1,MyInterface2{
@Override
public void method1() {
// TODO Auto-generated method stub
MyInterface1.super.method1();
}
}
//测试
@Test
public void test02() {
SonClass2 sc=new SonClass2();
sc.method1();
}
//结果
MyInterface1中的默认方法
二lambda表达式
1.为什么引用lambda表达式
答:将一个代码块传递到某个对象,将来某个时间点调用,但目前为止,java传输一段代码并不容易,需要构建一个对象,并且这个对象的某方法包含所需要的代码。lambda表达式就是为了解决这些问题
2.Lambda表达式的语法
基本语法:
(parameters) -> expression
或
(parameters) ->{ statements; }
下面是Java lambda表达式的简单例子:
// 1. 不需要参数,返回值为 5
() -> 5
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
①基本的Lambda例子
现在,我们已经知道什么是lambda表达式,让我们先从一些基本的例子开始。 在本节中,我们将看到lambda表达式如何影响我们编码的方式。 假设有一个玩家List ,程序员可以使用 for 语句 ("for 循环")来遍历,在Java SE 8中可以转换为另一种形式:
String[] atp = {"Rafael Nadal", "Novak Djokovic",
"Stanislas Wawrinka",
"David Ferrer","Roger Federer",
"Andy Murray","Tomas Berdych",
"Juan Martin Del Potro"};
List<String> players = Arrays.asList(atp);
// 以前的循环方式
for (String player : players) {
System.out.print(player + "; ");
}
// 使用 lambda 表达式以及函数操作(functional operation)
players.forEach((player) -> System.out.print(player + "; "));
// 在 Java 8 中使用双冒号操作符(double colon operator)
players.forEach(System.out::println);
,lambda表达式可以将我们的代码缩减到一行。 另一个例子是在图形用户界面程序中,匿名类可以使用lambda表达式来代替
// 使用匿名内部类
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
// 或者使用 lambda expression
btn.setOnAction(event -> System.out.println("Hello World!"));