`
deepinmind
  • 浏览: 451336 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
1dc14e59-7bdf-33ab-841a-02d087aed982
Java函数式编程
浏览量:41606
社区版块
存档分类
最新评论

Java 8的一些常见用法

阅读更多
lambda表达式

语法

最常用的:



Runnable runnable = () -> System.out.println("Hello!");
Thread t = new Thread(runnable);
t.start();
t.join();




你还可以这么写:




Thread t = new Thread(() -> System.out.println("Hello!"));
t.start();
t.join();




带有参数的呢?




Comparator<String> stringComparator = (s1, s2) -> s1.compareTo(s2);





扩展成一个完整的表达式:




Comparator<String> stringComparator = (String s1, String s2) -> {
    System.out.println("Comparing...");
    return s1.compareTo(s2);
};



函数式接口


Lambda表达式使得你可以更紧凑地表达出单方法类。单一方法类也被称作函数式接口,它可以通过
@FunctionalInterface来进行注解:


@FunctionalInterface
public interface MyFunctionalInterface<T> {
    boolean test(T t);
} 


// Usage
MyFunctionalInterface<String> l = s -> s.startsWith("A");



方法引用


方法引用就是更紧凑,易懂的Lambda表达式,它适用于那些已经有名字的方法。来看一个简单的例子:


public class Sample {


    public static void main(String[] args) {
       Runnable runnable = Sample::run;
    }


    private static void run() {
        System.out.println("Hello!");
    }
}



还有一个:


public static void main(String[] args) {
    Sample sample = new Sample();
    Comparator<String> stringLengthComparator = sample::compareLength;
}


private int compareLength(String s1, String s2) {
    return s1.length() - s2.length();
}



Stream API基础




stream是一个元素序列,它支持串行及并行的操作。


遍历列表




List<String> list = Arrays.asList("one", "two", "three", "four", "five", "six");


list.stream()
        .forEach(s -> System.out.println(s));





过滤



Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4;
Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3;


list.stream()
        .filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree))
        .forEach(s -> System.out.println(s));



排序
Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4;
Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3;
Comparator<String> byLastLetter = (s1, s2) -> s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1);
Comparator<String> byLength = (s1, s2) -> s1.length() - s2.length();


list.stream()
        .filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree))
        .sorted(byLastLetter.thenComparing(byLength))
        .forEach(s -> System.out.println(s));





大小限制





Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4;
Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3;
Comparator<String> byLastLetter = (s1, s2) -> s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1);
Comparator<String> byLength = (s1, s2) -> s1.length() - s2.length();


list.stream()
        .filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree))
        .sorted(byLastLetter.thenComparing(byLength))
        .limit(4)
        .forEach(s -> System.out.println(s));






集合转化成列表




Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4;
Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3;
Comparator<String> byLastLetter = (s1, s2) -> s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1);
Comparator<String> byLength = (s1, s2) -> s1.length() - s2.length();


List<String> result = list.stream()
        .filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree))
        .sorted(byLastLetter.thenComparing(byLength))
        .limit(4)
        .collect(Collectors.toList());



并行处理

用它来遍历文件列表则再常见不过了:





public static void main(String[] args) {
    File[] files = new File("c:/windows").listFiles();
    Stream.of(files)
            .parallel()
            .forEach(Sample::process);
}


private static void process(File file) {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
    }


    System.out.println("Processing -> " + file);
}







注意上面给出这个示例的同时,也暴露了并行处理的一些缺点。

Stream API进阶

映射

遍历文件后返回一个FileSize 对象:




class FileSize {


    private final File file;
    private final Long size;


    FileSize(File file, Long size) {
        this.file = file;
        this.size = size;
    }


    File getFile() {
        return file;
    }


    Long getSize() {
        return size;
    }


    String getName() {
        return getFile().getName();
    }


    String getFirstLetter() {
        return getName().substring(0, 1);
    }


    @Override
    public String toString() {
        return Objects.toStringHelper(this)
                .add("file", file)
                .add("size", size)
                .toString();
    }
}



最终进行映射的代码:





File[] files = new File("c:/windows").listFiles();
List<FileSize> result = Stream.of(files)
        .map(FileSize::new)
        .collect(Collectors.toList());





分组:


按文件名的第一个字母将FileSize对象分组





Map<String, List<FileSize>> result = Stream.of(files)
        .map(FileSize::new)
        .collect(Collectors.groupingBy(FileSize::getFirstLetter));





Reduce


找出文件夹下的最大最小文件:




Optional<FileSize> filesize = Stream.of(files)
        .map(FileSize::new)
        .reduce((fs1, fs2) -> fs1.getSize() > fs2.getSize() ? fs1 : fs2);





如果你不需要FileSize对象,只需要一个数值的话:




OptionalLong max = Stream.of(files)
        .map(FileSize::new)
        .mapToLong(fs -> fs.getSize())
        .max();






原创文章转载请注明出处:http://it.deepinmind.com

英文原文链接

3
3
分享到:
评论

相关推荐

    java中filter的用法(过滤器)

    ### Java中的Filter(过滤器)使用详解 ...以上就是关于Java中Filter(过滤器)的一些基本概念和具体实现方式的详细介绍。通过合理的使用Filter,开发者可以轻松地实现许多强大的功能,提高应用程序的安全性和性能。

    JAVA_split_用法

    ### JAVA_split_用法详解 在Java编程语言中,`String`类提供了多个实用的方法来处理字符串,其中`split()`方法是用于将一个字符串分割成字符串数组的一种常见方式。此方法利用正则表达式(Regular Expression)作为...

    Java业务开发常见错误.zip

    本压缩包文件"Java业务开发常见错误.zip"聚焦于Java开发中的一些常见陷阱,通过一系列文档帮助开发者理解和避免这些问题。 首先,"00丨开篇词丨业务代码真的会有这么多坑?.pdf"引出了一个核心问题,即业务代码的...

    Java 常见类库的介绍

    Java 类库是Java编程语言的核心组成部分,它包含了大量的预定义类和接口,这些类和接口提供了丰富的功能,方便开发者进行日常开发。Java类库主要分为若干个包,如`java.lang`、`java.util`、`java.io`等,每个包都有...

    java的关键字及用法

    揽括了java中常见的关键字及用法,包括Abstract、instanceof、private、protected等等。

    java八股文之Java8的用法.zip

    Java八股文是针对面试中常见Java编程问题的总结,主要关注Java 8的新特性和用法。在面试中,掌握这些知识不仅能展示你对语言的深入理解,也能体现出你的编程素养。Java 8作为Java的一个重要版本,引入了很多新功能,...

    java中try catch的用法

    ### Java中try-catch的用法详解 #### 一、基本概念 在Java编程语言中,`try-catch`结构是一种用于处理程序运行时可能出现的异常情况的重要机制。通过使用`try-catch`块,开发者可以更加精细地控制程序的行为,并...

    java的calendar具体用法

    在Java中处理日期和时间非常常见,而`java.util.Calendar`类则是进行此类操作的核心工具之一。`Calendar`类提供了一系列的功能来帮助开发者处理复杂的日期计算问题,比如日期的加减、获取特定日期组件等。 #### 二...

    java里日期的用法汇总

    ### Java里日期的用法汇总 #### 一、获取当前日期与时间 在Java中,获取当前日期与时间可以通过多种方式实现。以下是一些常用的方法: 1. **使用`Calendar`类**: - `Calendar`是Java中处理日期与时间的一个非常...

    java源代码,关于java中常见各种类的用法

    这份"java源代码,关于java中常见各种类的用法"的压缩包文件是学习Java基础知识的绝佳资源,尤其适合初学者。它包含了丰富的中文注解,帮助理解复杂的概念,使得学习过程更为直观和轻松。 首先,让我们深入探讨Java...

    Java常见笔试、面试题目深度剖析

    这份资源"Java常见笔试、面试题目深度剖析"显然是为了帮助求职者更好地准备相关考试而设计的。以下将对Java笔试和面试的一些核心知识点进行详细的阐述: 1. **基础语法**:Java的基础包括变量、数据类型、运算符、...

    Java8中Lambda表达式之Collection 的常见用法

    在java8中引入了Lambda表达式。其实,他就是一个匿名函数。我们经常会用到一些循环遍历,起始完全就可以通过Lambda来简化我们不必要的操作,下面我们来看一下Lambda常用的方法。

    java具体关键字和用法

    以上介绍了 Java 中的一些常见关键字及其用法。这些关键字是 Java 编程的基础,熟练掌握它们对于编写高效、可维护的 Java 应用程序至关重要。希望本文能帮助 Java 初学者更好地理解和使用这些关键字。

    javaList用法

    "javaList用法详解" Java 中的 List 用法是指在 Java 编程语言中使用 List 集合的方法和实现方式。List 集合是 Java 中的一种常用的集合类型,提供了许多实用的方法和实现类,下面将详细介绍 List 用法和实例。 ...

    java的一些常见面试题目.rar

    下面将根据这些常见的面试题目,详细解析一些重要的Java知识点。 1. **Java基础** - **变量和数据类型**:Java有基本数据类型(如int、char、float等)和引用数据类型(如类、接口和数组)。理解它们的区别和用法...

    Java枚举的七种常见用法.doc

    以下是对标题和描述中提及的Java枚举七种常见用法的详细说明: 1. 常量定义: 在Java中,枚举可以用来组织相关常量,提升代码的可读性和可维护性。例如,我们可以定义一个`Color`枚举,包含`RED`, `GREEN`, `BLANK`...

    面试题:Java String类常见操作和用法

    以上就是Java String类的一些基本操作和用法,理解并熟练运用这些知识点对于Java开发者来说非常重要,特别是在面试和实际项目开发中。通过深入学习和实践,您可以更好地处理字符串相关的各种问题。

    JAVA常见异常解析,面试用

    以下是一些Java常见异常的详细解析: 1. **java.lang.NullPointerException**: 当尝试访问或操作一个未初始化的对象引用时,会抛出此异常。确保在使用对象之前已经正确地初始化它,避免对null值进行方法调用或...

    Java中的this和super的用法 

    Java 中的 this 和 super 的用法 Java 中的 this 和 super 是两个非常重要的关键字,它们都是用来访问对象的成员变量和方法的。下面我们将详细地讨论这两个关键字的用法和区别。 一、基础知识 1. super(参数):...

    最新版javajdk8文档

    8. **接口的私有方法和静态方法**:Java 8允许接口定义私有方法和静态方法,增强了接口的功能,使其能够包含一些辅助方法。 9. **构造函数引用**:类似于方法引用,构造函数引用允许直接引用类的构造函数。例如,`...

Global site tag (gtag.js) - Google Analytics