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}]
- 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