美文网首页
2019-06-09 jave核心代码看书笔记(六)接口、lam

2019-06-09 jave核心代码看书笔记(六)接口、lam

作者: 张开翔 | 来源:发表于2019-06-10 00:17 被阅读0次

一,接口

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!"));

相关文章

网友评论

      本文标题:2019-06-09 jave核心代码看书笔记(六)接口、lam

      本文链接:https://www.haomeiwen.com/subject/thxnxctx.html