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();

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-11-03 21:14:53

Java 8的一些常见用法的相关文章

java中String的常见用法总结_java

1>获取  1.1:字符串中包含的字符数,也就是字符串的长度.  int length():获取长度  1.2:根据位置获取位置上某个字符.  char charAt(int index)  1.3:根据字符获取该字符在字符串中的位置.  int indexOf(int ch):返回的是ch在字符串中第一次出现的位置.  int indexOf(int ch,int fromIndex):从fromIndex指定位置开始,获取ch在字符串中出现的位置.   int indexOf(String

Java枚举的七种常见用法总结(必看)_java

用法一:常量 在JDK1.5之前,我们定义常量都是:publicstaticfianl.....现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. Java代码 public enum Color { RED, GREEN, BLANK, YELLOW } 用法二:switch JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强. Java代码 enum Signal { GREEN, YELLOW,

正则表达式介绍及常见用法

正则表达式(Regular Expression),又称正规表示法.常规表示法,在实际的软件开发项目中经常会被使用到.它使用单个字符串来描述.匹配并获取一系列符合某个句法规则的结果.   正则表达式起源 1956年,数学家Stephen Kleene在Warren McCulloch和Walter Pitts早期神经系统工作的基础上,设计出了一个数学符号体系--regular sets(规则的集合),这个东西很快被计算机科学家用于编译器的扫描或词法分析.由于正则表达式强大的文本处理能力,很快被应

Android编程开发中ListView的常见用法分析_Android

本文实例讲述了Android编程开发中ListView的常见用法.分享给大家供大家参考,具体如下: 一.ListView的使用步骤 ListView的使用通常有以下三个要素: (1)ListView中每个条目的布局; (2)填充进入ListView中的内容; (3)将内容与页面进行整合的Adapter. 因此,使用ListView也通常有以下三个步骤: (1)创建ListView条目的布局文件(或使用Android SDK提供的布局); (2)创建填充进入ListView中的内容,如字符串.图片

Android编程开发中ListView的常见用法分析

本文实例讲述了Android编程开发中ListView的常见用法.分享给大家供大家参考,具体如下: 一.ListView的使用步骤 ListView的使用通常有以下三个要素: (1)ListView中每个条目的布局; (2)填充进入ListView中的内容; (3)将内容与页面进行整合的Adapter. 因此,使用ListView也通常有以下三个步骤: (1)创建ListView条目的布局文件(或使用Android SDK提供的布局); (2)创建填充进入ListView中的内容,如字符串.图片

php中的curl使用入门教程和常见用法实例

[目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件上传 七.文件下载 八.http 验证 九.通过代理发送请求 十.发送json数据 十一.cURL批处理(multi cURL) 十二.总结 起先cURL是做为一种命令行工具设计出来的,比较幸运的是,php也支持cURL了.通过cURL这个利器,我们能在php程序中自由地发送 HTTP请求到某个url来获取

META标签的常见用法

最近,Danny Sullivan谈到了如何处理的搜索引擎meta标签的问题,以下是一些关于在Google中如何处理这些问题的答案. 多内容数值 我们建议你把所有的Meta标签内容放在一个meta中.这将使得meta标签更易于读取并降低发生错误的概率.例如: <META NAME="ROBOTS" C><metaname="robots"c> 如果一行包含对个meta标签,我们将会累加标签的内容,例如,我们会将 <META NAME=&

Java线程调度之线程休眠用法分析

  本文实例分析了Java线程调度之线程休眠用法.分享给大家供大家参考.具体分析如下: Java线程调度是Java多线程的核心,只有良好的调度,才能充分发挥系统的性能,提高程序的执行效率. 这里要明确的一点,不管程序员怎么编写调度,只能最大限度的影响线程执行的次序,而不能做到精准控制. 线程休眠的目的是使线程让出CPU的最简单的做法之一,线程休眠时候,会将CPU资源交给其他线程,以便能轮换执行,当休眠一定时间后,线程会苏醒,进入准备状态等待执行. 线程休眠的方法是Thread.sleep(lon

Java中的MessageFormat.format用法实例

  这篇文章主要介绍了Java中的MessageFormat.format用法实例,本文先是讲解了MessageFormat的语法,然后给出了多个操作实例,需要的朋友可以参考下 MessageFormat本身与语言环境无关,而与用户提供给MessageFormat的模式和用于已插入参数的子格式模式有关,以生成适用于不同语言环境的消息. MessageFormat模式(主要部分): 代码如下: FormatElement: { ArgumentIndex }:是从0开始的入参位置索引. { Arg