用java8重写Arrays.sort(oldWay, new Comparator<String>(){@Override public int compare(String s1, String s2)});

参考https://www.liaoxuefeng.com/article/001411306573093ce6ebcdd67624db98acedb2a905c8ea4000/

Java 8终于引进了lambda表达式,这标志着Java往函数式编程又迈进了一小步。

在Java 8以前的代码中,为了实现带一个方法的接口,往往需要定义一个匿名类并复写接口方法,代码显得很臃肿。比如常见的Comparator接口:

String[] oldWay = "Improving code with Lambda expressions in Java 8".split(" ");
Arrays.sort(oldWay, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        // 忽略大小写排序:
        return s1.toLowerCase().compareTo(s2.toLowerCase());
    }
});
System.out.println(String.join(", ", oldWay));

对于只有一个方法的接口,在Java 8中,现在可以把它视为一个函数,用lambda表示式简化如下:

String[] newWay = "Improving code with Lambda expressions in Java 8".split(" ");
Arrays.sort(newWay, (s1, s2) -> {
    return s1.toLowerCase().compareTo(s2.toLowerCase());
});
System.out.println(String.join(", ", newWay));

Java 8没有引入新的关键字lambda,而是用()->{}这个奇怪的符号表示lambda函数。函数类型不需要申明,可以由接口的方法签名自动推导出来,对于上面的lambda函数:

(s1, s2) -> {
    return s1.toLowerCase().compareTo(s2.toLowerCase());
});

参数由Comparator<String>自动推导出String类型,返回值也必须符合接口的方法签名。

实际上,lambda表达式最终也被编译为一个实现类,不过语法上做了简化。

稍微变动一下

 参考:https://www.nowcoder.com/practice/8fecd3f8ba334add803bf2a06af1b993?tpId=13&tqId=11185&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

String[] strArr={"32","43"}; Arrays.sort(strArr,new Comparator<String>(){
            @Override
            public int compare(String s1, String s2) {
                String c1 = s1 + s2;
                String c2 = s2 + s1;
                return c1.compareTo(c2);
            }
用java8方式改写成如下形式:String[] strArr={"21","33"};
Arrays.sort(strArr,(a,b)->{
                String c=a+""+b;
                String d=b+""+a;
                return c.compareTo(d);
            });

上面代码实现的是:for (int i=0;i<numbers.length;i++){    for (int j=i+1;j<numbers.length;j++){        Long a=Long.valueOf(numbers[i]+""+numbers[j]);        Long b=Long.valueOf(numbers[j]+""+numbers[i]);        if(a>b){            int temp=numbers[i];            numbers[i]=numbers[j];            numbers[j]=temp;        }    }}

对于Java自带的标准库里的大量单一方法接口,很多都已经标记为@FunctionalInterface,表明该接口可以作为函数使用。

Runnable接口为例,很多时候干活的代码还没有定义class的代码多,现在可以用lambda实现:

public static void main(String[] args) {
    // old way:
    Runnable oldRunnable = new Runnable() {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + ": Old Runnable");
        }
    };
    Runnable newRunnable = () -> {
        System.out.println(Thread.currentThread().getName() + ": New Lambda Runnable");
    };
    new Thread(oldRunnable).start();
    new Thread(newRunnable).start();
}

在未来的Java代码中,会出现越来越多的()->{}表达式。

原文地址:https://www.cnblogs.com/lijingran/p/8979397.html

时间: 2024-08-06 06:46:24

用java8重写Arrays.sort(oldWay, new Comparator<String>(){@Override public int compare(String s1, String s2)});的相关文章

Java8 Collections.sort()及Arrays.sort()中Lambda表达式及增强版Comparator的使用

摘要:本文主要介绍Java8 中Arrays.sort()及Collections.sort()中Lambda表达式及增强版Comparator的使用. 不废话直接上代码 import com.google.common.collect.Lists; import org.junit.Assert; import org.junit.Test; import java.util.Arrays; import java.util.Collections; import java.util.Comp

Collections.sort(List&lt;T&gt; Comparator) 自定义排序

Collections.sort(basicinfoList, new Comparator<MlisBasicinfo>() { @Override public int compare(MlisBasicinfo o1, MlisBasicinfo o2) { return o1.getBasicinfoValue().compareTo(o2.getBasicinfoValue()); } });

Java8:Lambda表达式增强版Comparator和排序

1.概述 在这篇教程里,我们将要去了解下即将到来的JDK 8(译注,现在JDK 8已经发布了)中的Lambda表达式--特别是怎样使用它来编写Comparator和对集合(Collection)进行排序. 这篇文章是Baeldung上的"Java --回归基础"("Java – Back to Basic")系列的一部分. 首先,让我们先定义一个简单的实体类: public class Human { private String name; private int

十五、Collections.sort(&lt;T&gt;, new Comparator&lt;T&gt;() {})针对字符串排序

1.排序对象全是字母组成,可以根据ASCII编码表排序 package com.abcd; public class Person{ private String name; private int age; private int salary; public Person() { } public Person(String name, int age, int salary) { this.name = name; this.age = age; this.salary = salary;

39-java中Arrays.sort 和 collections.sort()总结

总结一下java 中的两种排序工具: Arrays.sort() : 主要针对 数组类型排序,如果数组里面的元素是对象,要按对象属性排序的话,需要重写 Comparator() 函数,重写里面的  int compare()函数; Collections.sort(): 主要是针对集合排序,如:list. 当然如果数组 array[i] 的每项是一个list 也可以直接用.与Arrays.sort()一样,重写 Comparator()函数. 注意:两种方式重写的函数方式是一样的,单词不要写错哟

(转)Arrays.sort()你应该知道的事

Arrays.sort(T[], Comparator < ? super T > c) 是用来对用户自定义的对象数组排序功能的.Java 官方文档简单描述了它的作用,但不足以让我们深刻理解.为了更深入地理解它,这篇文章将梳理相关的关键点. 1.简单实例:如何使用Arrays.sort() 通过阅读下面代码,你能快速正确了解这个方法的用途.Comparator(比较器)用于根据Dogs的size比较其大小,并作为sort方法的参数. 1 2 3 4 5 6 7 8 9 10 11 12 13

深入理解Arrays.sort() (转)

Arrays.sort(T[], Comparator < ? super T > c) 方法用于对象数组按用户自定义规则排序.官方Java文档只是简要描述此方法的作用,并未进行详细的介绍,本文将深入解析此方法.1. 简单示例sort方法的使用非常的简单明了,下面的例子中,先定义一个比较Dog大小的Comparator,然后将其实例对象作为参数传给sort方法,通过此示例,你应该能够快速掌握Arrays.sort()的使用方法. [java] view plaincopy import jav

JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序

一.描述 自定义的类要按照一定的方式进行排序,比如一个Person类要按照年龄进行从小到大排序,比如一个Student类要按照成绩进行由高到低排序. 这里我们采用两种方式,一种是使用Comparable接口:让待排序对象所在的类实现Comparable接口,并重写Comparable接口中的compareTo()方法,缺点是只能按照一种规则排序. 另一种方式是使用Comparator接口:编写多个排序方式类实现Comparator接口,并重写新Comparator接口中的compare()方法,

java中排序函数sort()使用,Arrays.sort()和Collections.sort()

Java中常用的数组或集合排序的方法有两个,一个是java.util.Arrays中的静态方法Arrays.sort(),还有一个是java.util.Collections中的静态方法的Collections.sort()方法,下面分别介绍两种用法. 一.java.util.Arrays中的静态方法Arrays.sort() Arrays中的sort()方法主要是针对各种数据类型(基本数据类型和引用对象类型)的数组元素排序. ....... 关于引用对象类型数组的排序sort()方法要用到接口