参考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代码中,会出现越来越多的()->{}表达式。

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

  1. 48- java Arrays.sort和collections.sort()再次总结

    今天又碰到一个新BUG,记下来. 一直报空指针异常,我就很奇怪了,怎么就空指针了呢,我输出时,也能输出东西呀. 原来Arrays.sort() 和 Collections.sort() 都是对整个数组 ...

  2. Java中Arrays.sort()和Collections.sort()

    1.简单示例 sort方法的使用非常的简单明了,下面的例子中,先定义一个比较Dog大小的Comparator,然后将其实例对象作为参数传给sort方法,通过此示例,你应该能够快速掌握Arrays.so ...

  3. JAVA基础系列:Arrays.sort()

    JDK 1.8  java.util.Arrays.class(rt.jar) 1. Collections.sort方法底层就是调用的Arrays.sort方法. 2. Java Arrays中提供 ...

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

    摘要:本文主要介绍Java8 中Arrays.sort()及Collections.sort()中Lambda表达式及增强版Comparator的使用. 不废话直接上代码 import com.goo ...

  5. 剑指Offer——巧妙使用sort(List<T>,Comparator<? super T>)比较器

    剑指Offer--巧妙使用sort(List<T>,Comparator<? super T>)比较器 先入为主 package cn.edu.ujn.offersword; ...

  6. Collections.sort(List<T> Comparator) 自定义排序

    Collections.sort(basicinfoList, new Comparator<MlisBasicinfo>() { @Override public int compare ...

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

    1.概述 在这篇教程里,我们将要去了解下即将到来的JDK 8(译注,现在JDK 8已经发布了)中的Lambda表达式——特别是怎样使用它来编写Comparator和对集合(Collection)进行排 ...

  8. 十五、Collections.sort(<T>, new Comparator<T>() {})针对字符串排序

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

  9. Java8中list.sort的lamba表达式

    最近写代码,需要对list集合排序,IDEA总是黄色警告: Reports calls to Collections.sort(list, comparator) which could be rep ...

随机推荐

  1. Linux 系统应用编程——进程基础

    一.Linux下多任务机制的介绍 Linux有一特性是多任务,多任务处理是指用户可以在同一时间内运行多个应用程序,每个正在执行的应用程序被称为一个任务. 多任务操作系统使用某种调度(shedule)策 ...

  2. LeetCode(44)- Isomorphic Strings

    题目: Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the c ...

  3. DB Query Analyzer 5.03 is distributed, EXCEL table name will be enclosed in square bracket

      DB Query Analyzer 5.03 is distributed, table name will be enclosed in square bracket automatically ...

  4. Course2-Python函数和模块

    一. 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率. 上一课里提到了Python的很多内置函数.在此主要讲自定义函数. 1. 定 ...

  5. nifi1.6.0汉化

    1.1 测试机 l  Apache NiFi 1.6.0 l  HDP 2.6.3 l  集群规模:单节点 l  操作系统:CentOs7 l  以下所有操作均在root用户下执行 1.2 安装环境 ...

  6. nodejs+express blog项目分享

    项目简介:项目采用nodejs+express+typescript+mongodb技术搭建 主要功能: 1.用户注册 2.用户登录 3.文章管理模块 4.图片管理模块 5.token认证 6.密码加 ...

  7. Mysql创建索引

    1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有 ...

  8. java日期操作常用工具

    java日期操作常用工具 package com..util; import java.sql.Timestamp; import java.text.SimpleDateFormat; import ...

  9. 发布开源库到JCenter所遇到的一些问题记录

    这周末自己瞎折磨了下,如何发布开源库到 JCenter,然后这过程中碰到了一些问题,在此记录分享一下 本篇是基于上一篇:教你一步步发布一个开源库到 JCenter 介绍的流程.步骤中所遇到的问题,所以 ...

  10. Codeforces Round #479 (Div. 3) A. Wrong Subtraction

    题目网址:http://codeforces.com/contest/977/problem/A 题解:给你一个数n,进行k次变换,从末尾开始-1,512变成511,511变成510,510会把0消掉 ...