Java9-day08【方法引用、Stream流】课后习题

练习一:函数式接口

  1. 定义一个函数式接口CurrentTimePrinter,其中抽象方法void printCurrentTime(),使用注解@FunctionalInterface
  2. 在测试类中定义static void showLongTime(CurrentTimePrinter timePrinter),该方法的预期行为是使用timePrinter打印系统当前毫秒值
  3. 测试showLongTime(),通过lambda表达式完成需求

答案

TimePrinter接口:

@FunctionalInterface
public interface CurrentTimePrinter
{
    void printCurrenTime();
}

测试类:

public class Test01 {
    public static void main(String[] args) {
        showLongTime(()->System.out.println(System.currentTimeMillis()));
    }

    public static void showLongTime(CurrentTimePrinter timePrinter){
        timePrinter.printCurrentTime();
    }
}

练习二:函数式接口

  1. 定义一个函数式接口IntCalc,其中抽象方法int calc(int a , int b),使用注解@FunctionalInterface
  2. 在测试类中定义static void getProduct(int a , int b ,IntCalc calc), 该方法的预期行为是使用calc得到a和b的乘积并打印结果
  3. 测试getProduct(),通过lambda表达式完成需求

答案

IntCalc接口:

@FunctionalInterface
public interface IntCalc {
    int calc(int a, int b);
}

测试类:

public class Test02 {
    public static void main(String[] args) {
        getProduct(2,3,(a,b)->a*b);
    }
    public static void getProduct(int a, int b, IntCalc intCalc){
        int product = intCalc.calc(a,b);
        System.out.println(product);

    }
}

练习三:静态方法引用

  1. 定义一个函数式接口NumberToString,其中抽象方法String convert(int num),使用注解@FunctionalInterface
  2. 在测试类中定义static void decToHex(int num ,NumberToString nts), 该方法的预期行为是使用nts将一个十进制整数转换成十六进制表示的字符串,tips:已知该行为与Integer类中的toHexString方法一致
  3. 测试decToHex (),使用方法引用完成需求

答案

NumberToString接口:

@FunctionalInterface
public interface NumberToString {
    String convert(int num);
}

测试类:

public class Test03 {
    public static void main(String[] args) {
        decToHex(999, Integer::toHexString);
    }
    public static void decToHex(int num ,NumberToString nts){
        String convert = nts.convert(num);
        System.out.println(convert);
    }
}

练习四:成员方法引用、可变参数

  1. 已知有随机数工具类如下:
import java.util.Random;
public class RandomUtil {
    private Random random = new Random();

    public int nextInt(int... nums) {
        if (nums == null || nums.length == 0) {
            throw new RuntimeException("pls认真一点!");
        }
	   //生成1到nums[0](包含1和nums[0])之间的随机数
        if (nums.length == 1) return random.nextInt(nums[0]) + 1;

        //生成nums[0]到nums[1](包含nums[0]和nums[1])之间的随机数
        if (nums.length == 2) return random.nextInt(nums[1] + 1 - nums[0]) + nums[0];
        
	   //从数组nums中取出一个随机元素
	   return nums[random.nextInt(nums.length)];
    }
}
  • 定义一个函数式接口NumberSupplier,其中抽象方法int getNum(int…nums),使用注解@FunctionalInterface
  • 在测试类中定义static void getRandomNumFromOneToNum(int num , NumberSupplier ns), 该方法的预期行为是使用ns得到一个从1到num(包含1和num)之间的随机数并打印
  • 在测试类中定义static void getRandomNumFromAToB(int a ,int b, NumberSupplier ns), 该方法的预期行为是使用ns得到一个从a到b(包含a和b)之间的随机数并打印
  • 在测试类中定义static void getRandomNumFromArray(int[] nums, NumberSupplier ns), 该方法的预期行为是使用ns从数组nums中获取一个随机元素并打印
  • 主方法中测试调用以上三个方法,使用方法引用完成需求

答案

NumberFactory接口:

@FunctionalInterface
public interface NumberSupplier{
    int getNum(int...nums);
}

测试类:

public class Test04 {
    public static void main(String[] args) {
        RandomUtil randomUtil = new RandomUtil();
        getRandomNumFromOneToNum(10, randomUtil::nextInt);
        getRandomNumFromAToB(10, 20, randomUtil::nextInt);
        int[] arr = {2, 4, 6, 8};
        getRandomNumFromArray(arr, randomUtil::nextInt);
    }

    public static void getRandomNumFromOneToNum(int num, NumberSupplier ns) {
        int result = ns.getNum(num);
        System.out.println(result);

    }

    public static void getRandomNumFromAToB(int a, int b, NumberSupplier ns) {
        int result = ns.getNum(a, b);
        System.out.println(result);
    }

    public static void getRandomNumFromArray(int[] nums, NumberSupplier ns) {
        int result = ns.getNum(nums);
        System.out.println(result);
    }

}

练习:类的构造器引用

  1. 有对象工厂BeanFactory接口如下
@FunctionalInterface
public interface BeanFactory<T> {
    T getBean();
}
  • 有汽车类Car如下
public class Car {
    private String brand;

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public Car(String brand) {
        this.brand = brand;
    }

    public Car() {

    }
}
  • 有测试类如下
public class Test06 {
    public static void main(String[] args) {
        Car Q7 = getCar(______);
        Q7.setBrand("奥迪");
    }
    public static Car getCar(____________){
        return factory.getBean();
    }
}
  • 补全测试类中横线处的代码,完成原代码的需求

答案

public class Test06 {
    public static void main(String[] args) {
        Car Q7 = getCar(Car::new);
        Q7.setBrand("奥迪");
    }
    public static Car getCar(BeanFactory<Car> factory){
        return factory.getBean();
    }
}

练习六:数组构造器引用

  1. 定义一个函数式接口ArrayBuilder<T>,提供带泛型的抽象方法T[] buildArray(int length),使用注解@FunctionalInterface
  2. 在测试类中定义static void getIntegerArray(int length , ArrayBuilder<Integer> builder), 该方法的预期行为是使用builder创建一个长度为length的Integer数组并打印其内存地址
  3. 测试getIntegerArray (),使用方法引用完成需求

答案

ArrayBuilder接口:

@FunctionalInterface
public interface ArrayBuilder<T> {
     T[] buildArray(int length);
}

测试类

public class Test07 {

    public static void main(String[] args) {
        getintarray(5, Integer[]::new);
    }
    private static void getintarray(int length,ArrayBuilder<Integer> builder){
        Integer[] array = builder.buildArray(length);
        System.out.println(array);

    }
}

习七:综合练习

  1. 定义学生类:
  2. 成员变量 姓名:String name;
  3. 成员变量 成绩:int score;
  4. 无参及全参构造
  5. 重写toString()
  6. 学生信息与成绩如下:
姓名数学
谢霆锋85
章子怡63
刘亦菲77
黄晓明33
岑小村92
  • 在测试类中完成如下要求
  • 将五名学生添加到ArrayList集合
  • 使用Collections.sort(List<T> list, Comparator<? super T> c)方法将学生成绩从小到大进行排序(忽略非空判断)
  • 使用匿名内部类
  • 使用Lambda表达式
  • 使用方法引用 //tips:借助Comparator接口中静态方法comparingInt()方法

答案

Student类:

public class Student {
    private String name;
    private int score;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getScore() {
        return score;
    }
    public void setScore(int score) {
        this.score = score;
    }
    public Student() {
    }
    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", score=" + score +
                '}';
    }
}

测试类:

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

public class Test08 {
    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<>();
        list.add(new Student("谢霆锋", 85));
        list.add(new Student("章子怡", 63));
        list.add(new Student("刘亦菲", 77));
        list.add(new Student("黄晓明", 33));
        list.add(new Student("岑小村", 92));

        //使用匿名内部类将成绩从小到大排序
        /*Collections.sort(list, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                //  忽略非空判断
                return o1.getScore() - o2.getScore();
            }
        });*/

        //使用Lambda为英语成绩从小到大排序
        //Collections.sort(list,(o1, o2) -> o1.getScore()-o2.getScore());
        
		//借助comparingInt()使用方法引用
		Collections.sort(list, Comparator.comparingInt(Student::getScore));

System.out.println(list);
        
    }
}

原创文章,作者:小助手,如若转载,请注明出处:https://www.javahelp.com.cn/1069.html

(0)
上一篇 2022年9月2日 下午11:09
下一篇 2022年9月2日 下午11:20

相关推荐

发表回复

登录后才能评论