Java二次复习笔记(2)

Java二次复习笔记(2)

比较器(内部比较器、外部比较器)

内部比较器:(实现Comparable接口)
InCompareTo.java

package comparator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Person implements Comparable{
    private int id;
    private String name;
    private int age;
    private double height;

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", height=" + height +
                '}';
    }

    public Person(){}
    public Person(int id, String name, int age, double height) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.height = height;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    //内部比较器
    @Override
    public int compareTo(Object o) {
        Person inputPerson = (Person)o;
        //根据id值降序
        return this.id<inputPerson.getId() ? 1 : (this.id == inputPerson.getId() ? 0 : -1);
    }
}

public class InCompareTo {

    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        Person p1 = new Person(1,"张三",20,1.78);
        Person p2 = new Person(3,"王五",25,1.69);
        Person p3 = new Person(2,"李四",22,1.88);
        list.add(p1);
        list.add(p2);
        list.add(p3);
        System.out.println(list);
        //使用内部比较器  id降序排序
        Collections.sort(list);
        System.out.println("id降序排序:"+list);
    }
}

运行结果:

[Person{id=1, name='张三', age=20, height=1.78}, Person{id=3, name='王五', age=25, height=1.69}, Person{id=2, name='李四', age=22, height=1.88}]
id降序排序:[Person{id=3, name='王五', age=25, height=1.69}, Person{id=2, name='李四', age=22, height=1.88}, Person{id=1, name='张三', age=20, height=1.78}]

外部比较器:(实现Comparator接口)
OutComparator.java

package comparator;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * @author User: 鹏
 * @version 创建时间:2020/5/28 10:29
 * 描述:
 */
class Student{
    private int id;
    private String name;
    private int age;
    private double height;

    public Student() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public Student(int id, String name, int age, double height) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.height = height;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", height=" + height +
                '}';
    }
}
//外部比较器
class MyComparator implements Comparator{
        //id升序
//    @Override
//    public int compare(Object o1, Object o2) {
//        Student s1 = (Student)o1;
//        Student s2 = (Student)o2;
//
//        return s1.getId() - s2.getId();
//    }

    //如果id值相同,再根据姓名降序
    @Override
    public int compare(Object o1, Object o2){
        Student s1 = (Student)o1;
        Student s2 = (Student)o2;
        int result = s1.getId() - s2.getId();

        if (result==0){
            result = -s1.getName().compareTo(s2.getName());//调用String已经重写过的compareTo()方法
        }
        return result;
    }
}
public class OutComparator {
    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        Student stu1 = new Student(2,"李四",20,1.88);
        Student stu2 = new Student(1,"张三",21,1.78);
        Student stu3 = new Student(3,"王五",20,1.80);
        Student stu4 = new Student(3,"赵六",20,1.80);
        list.add(stu1);
        list.add(stu2);
        list.add(stu3);
        list.add(stu4);
        System.out.println(list);
        //使用外部比较器  id升序
        Collections.sort(list, new MyComparator());
        System.out.println(list);
    }
}

运行结果:

[Student{id=2, name='李四', age=20, height=1.88}, Student{id=1, name='张三', age=21, height=1.78}, Student{id=3, name='王五', age=20, height=1.8}, Student{id=3, name='赵六', age=20, height=1.8}]
[Student{id=1, name='张三', age=21, height=1.78}, Student{id=2, name='李四', age=20, height=1.88}, Student{id=3, name='赵六', age=20, height=1.8}, Student{id=3, name='王五', age=20, height=1.8}]
  1. jdk8中,可以使用关键字default关键字在接口中定义默认方法,并提供默认实现。之后该接口的所有实现类都会默认的使用该实现方法。当然也可以对该默认方法进行重写。例如:
public interface MyInterface {
    default String myFunction(){
        return "hello world";
    }
}

此外,还可以在接口中定义默认默认静态方法。例如:

public interface MyInterface {
    static String myFunction(){
        return "hello world";
    }
}

函数式接口与λ

标注@FunctionalInterface,称为函数式接口,其有且只有一个抽象方法(可以是接口,也可以是抽象类)。
jdk8中重要知识点->lambda(标注@FunctionalInterface就可以使用λ)
lambda λ组成:
* 逗号隔开的参数列表 (x,x,x) ()
* 箭头符号 ->
* 方法体 (λ代码块)

public class LambdaTest {

    public static void test01(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("run...1");
            }
        }).start();
    }
    /*将无意义的删去:比如方法名、返回值类型(可以由return决定返回值)*/
      /*将有意义的留下:比如方法体、有参还是无参(如果有参,参数类型是什么;若无参,只写一对括号)*/
    public static void test02(){
        new Thread(()  ->  {System.out.println("run...2");}  ).start();
    }
    public static void test03(){
        new Thread(()  ->  System.out.println("run...3")  ).start();
    }
    public static void main(String[] args){
        test01();
        test02();
        test03();
    }
}

运行结果:

run...1
run...3
run...2

四大核心函数式接口
MyInterface.hjava

package lambda;

@FunctionalInterface    //标注@FunctionalInterface,称为函数式接口,其有且只有一个抽象方法(可以是接口,也可以是抽象类)
public interface MyInterface {
    int add(int num1,int num2);
}

MyLambda.java

package lambda;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
/**
 * @author User: 鹏
 * @version 创建时间:2020/5/24 21:22
 * @description 描述:
 */
public class MyLambda {
/********************四大核心函数式接口******************************/
    /**
     * test01(),test02(),test03(),test04()四大核心函数式接口
     */
    //断言式接口
    public static void test01(){
        Predicate<Integer> p = (num) -> num>10 ;
        System.out.println(p.test(15));
    }
    //有参无返回值(消费型)
    public static void test02(){
        Consumer<String> c = (name) -> System.out.println("他的名字是:"+ name) ;
        c.accept("张三");
    }
    //无参有返回值(供给型)
    public static void test03(){
        Supplier<String> s = () -> "a" ;
        System.out.println(s.get());
    }
    //有参有返回值(函数型)
    public static void test04(){
        //<参数类型,返回值类型>
        Function<String,String> f = (s) -> s.toUpperCase();
        System.out.println(f.apply("hello world"));
    }
/**************************************************/
    public static void test05() {
        MyInterface mi = (num1,num2) -> num1 + num2;
        System.out.println(mi.add(5,6));
    }

/*******************函数式编程*******************************/
    //方法B(方法A) 称为函数式编程
    //方法B(函数式接口)
    public static void test06(){    //方法B()
        String result = upper((s) -> s.toUpperCase() ,"hello world");
        System.out.println(result);
    }
    public static String upper(Function<String,String> fun,String str){   //方法B()里面的函数式接口
        return fun.apply(str);
    }
/**************************************************/
    public static void main(String[] args) {
        test01();
        test02();
        test03();
        test04();
        test05();
        test06();
    }
}

运行结果:

true
他的名字是:张三
a
HELLO WORLD
11
HELLO WORLD

猜你喜欢

转载自www.cnblogs.com/xiaochen2715/p/13167026.html