当前位置:网站首页>函數式接口,方法引用,Lambda實現的List集合排序小工具

函數式接口,方法引用,Lambda實現的List集合排序小工具

2022-07-04 16:12:00 人形bug制造機9527

1.在Java8中引入了一個函數式接口Consumer的對象,該對象可以把方法作為參數進行傳遞。
關於lambda的教程

/** * 集合排序 */
@AllArgsConstructor
public class CollSort {
    

    // 排序因子
    private final Long order;

    public final static CollSort DESC = new CollSort(-1L);
    public final static CollSort ASC = new CollSort(1L);

    // 根據數字排序
    public <E> Collection<E> sort(Collection<E> collection, ProcessorNumber<E> getParam) {
    
        return collection.stream()
                .filter(Objects::nonNull)
                .sorted((o1, o2) -> {
    
                    // 這裏執行傳入的抽象方法,並傳入函數方法需要的參數,
                    // getParam的返回值已經在抽象函數方法中確定了
                    long result = Long.parseLong(String.valueOf(getParam.accept(o1))) - Long.parseLong(String.valueOf(getParam.accept(o2)));
                    result = result * order; // 排序系數介入
                    return result == 0 ? 0 : result < 0 ? -1 : 1;
                })
                .collect(Collectors.toList());
    }

    // 根據時間排序
    public <E> Collection<E> sort(Collection<E> collection, ProcessorDate<E> getParam) {
    
        return collection.stream()
                .filter(Objects::nonNull) // 無效數據過濾
                .sorted((o1, o2) -> {
    
                    long t1 = getParam.accept(o1).getTime(); // 這裏抽象方法getParam的返回值已經在抽象函數方法中確定了
                    long t2 = getParam.accept(o2).getTime();
                    long result = t1 - t2;
                    result = result * order; // 排序系數介入
                    return result == 0 ? 0 : result < 0 ? -1 : 1;
                })
                .collect(Collectors.toList());
    }

}

@FunctionalInterface
interface ProcessorDate<E> {
    

    /** * 獲取對象時間屬性的抽象函數方法 * * @param t 對象 * @return 對象的時間屬性 */
    Date accept(E t);
}

@FunctionalInterface
interface ProcessorNumber<E> {
    

    /** * 獲取對象數字屬性的抽象函數方法 * * @param t 對象 * @return 對象的數字屬性 */
    Number accept(E t);
}


使用

  public static void main(String[] args) {
    
     SortTest sortTest = new SortTest();
     ArrayList<User> users = new ArrayList<>();
     users.add(new User("zz", 14,new Date()));
     users.add(new User("zz", 17,new Date(System.currentTimeMillis()+1000000)));
     users.add(new User("zz", 11,new Date(System.currentTimeMillis()+4000000)));
     users.add(new User("zz", 15,new Date(System.currentTimeMillis()+9000000)));
     users.add(new User("zz", 21,new Date(System.currentTimeMillis()+8000000)));
     users.add(new User("zz", 7,new Date(System.currentTimeMillis()+3000000)));
     sortTest.test(users);
 }
 public void test(List<User> users) {
    
     // 就普通的工具方法調用,區別就是參數是一個方法,也可以直接引用方法
     Collection<User> ageSort = CollSort.ASC.sort(users, User::getAge);
     System.out.println("年齡排序=========================");
     ageSort.forEach(System.out::println);
     System.out.println("生日排序排序======================");
     Collection<User> timeSort = CollSort.DESC.sort(users, User::getBirthDay);
     timeSort.forEach(System.out::println);
 }

效果
在這裏插入圖片描述
可以根據需求自行拓展函數接口,需要注意參數類型返回值類型,大多數時候更換返回值類型就可以了;

參數類型以及返回值類型影響這個函數方法在調用的時候需要傳入的參數,以及響應值

原网站

版权声明
本文为[人形bug制造機9527]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/185/202207041430108042.html