Java8 新特性Lambda表达式

sort和Comparator
class test{
    public static void main(String[] args) {
        List<Integer> list=new ArrayList<>(Arrays.asList(1,2,3,4,5));
        list.sort((t1,t2)->t2-t1); //实现list从大到小排序  
        list.forEach(System.out::println);
    }
}
  • 每次写sort的时候若我们需要按自己的排序规则来写的话都需要实现一个Comparator
  • 我们用Lambda表达式的话很容易就实现从大到小排序,而且更加简洁。
foreach
  • 我们需要遍历打印list
list.forEach(t->System.out.println(t));//这样看起来更加简洁明了
  • 不过上面的代码会爆警告,Can be replaced with method reference less,我们可以修改一下。
list.forEach(System.out::println);//大大减少了代码量

  • Comparator内置的一些default方法完全能实现简单排序规则
  • 例如Comparator的comparing对整型的值进行排序
  • reversed()即采取和你之前的排序规则相反的规则来对list进行排序
public class LambdaTest {
    @Test
    public void test(){
        List<Integer> list=new ArrayList<>(Arrays.asList(1,3,2,5,4));
        Comparator<Integer> comparator=Comparator.comparing(Integer::intValue);
        list.sort(comparator);
        list.forEach(System.out::println);
        list.sort(comparator.reversed());
        list.forEach(System.out::println);
    }
}
  • 如果是我们自定义的类,这里我们实现了一个Fruit类,利用Comparator我们实现了自定义的类按照价格的大小从小
    到大排序 Comparator.comparing(Fruit::getPrice)
public class LambdaTest {
    class Fruit{
        int id;
        String name;
        int price;

        public Fruit(int id, String name, int price) {
            this.id = id;
            this.name = name;
            this.price = price;
        }
        public int getPrice() {
            return price;
        }
        @Override
        public String toString() {
            return "Fruit"+id+": name="+name+", price="+price;
        }
    }
    @Test
    public void test1(){
        List<Fruit> list=new ArrayList<>();
        list.add(new Fruit(1,"Apple",18));
        list.add(new Fruit(2,"Banana",15));
        list.add(new Fruit(3,"Orange",17));
        Comparator<Fruit> comparator=Comparator.comparing(Fruit::getPrice);
        list.sort(comparator);
        list.forEach(System.out::println);
    }
}
  • 可是往往我们不止是根据对象的一个成员变量来进行排序,我们需要更加多个成员变量来进行排序,多个成员组合排序
    使用到了comparator.thenComparing(comparator1) 这里我们先按价格的大小排序,如果价格相同,我们利用
    水果名字字典序较小的进行排序。
public class LambdaTest {
    @Test
    public void test1(){
        List<Fruit> list=new ArrayList<>();
        list.add(new Fruit(1,"Apple",18));
        list.add(new Fruit(2,"Banana",15));
        list.add(new Fruit(3,"Orange",17));
        list.add(new Fruit(4,"Apple",15));
        Comparator<Fruit> comparator=Comparator.comparing(Fruit::getPrice);
        Comparator<Fruit> comparator1=Comparator.comparing(Fruit::getName);
        list.sort(comparator.thenComparing(comparator1));//多个成员组合排序
        list.forEach(System.out::println);
    }
}
  • 如果不写Comparator直接在sort里面写排序规则,那么大概就如下,年龄不同按年龄排序,年龄相同按字典序排序
list.sort((t1,t2)->(t1.price-t2.price!=0)?t1.price-t2.price:t1.name.compareTo(t2.name));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值