java自带函数_java8 内置函数(api)总结

常用的函数接口记录方便以后翻吧

接口

参数

返回类型

说明

Predicate

T

boolean

输入某个值,输出boolean 值,用于对某值进行判定

Consumer

T

void

输入某值,无输出。用于消费某值

Function

T

R

输入某类型值,输出另种类型值,用于类型转化等

Supplier

None

T

无输入,输出某值,用于生产某值

UnaryOperator

T

T

输入某类型值,输出同类型值,用于值的同类型转化,如对值进行四则运算等

BinaryOperator

(T,T)

T

输入两个某类型值,输出一个同类型值,用于两值合并等

Predicates

Predicates是包含一个参数的布尔值接口。其包括一些缺省方法,组合他们使用可以实现复杂的业务逻辑(如:and, or, negate)。示例代码如下:

Predicate predicate = (s) -> s.length() > 0;

predicate.test("foo"); // true

predicate.negate().test("foo"); // false

Predicate nonNull = Objects::nonNull;

Predicate isNull = Objects::isNull;

Predicate isEmpty = String::isEmpty;

Predicate isNotEmpty = isEmpty.negate();

Functions

Functions接口接收一个参数并产生一个结果。其缺省方法通常被用来链接多个功能一起使用 (compose, andThen)。

Function toInteger = Integer::valueOf;

Function backToString = toInteger.andThen(String::valueOf);

backToString.apply("123"); // "123"

Suppliers

Suppliers接口生成一个给定类型结果。和Functions不同,其没有接收参数。

Supplier personSupplier = Person::new;

personSupplier.get(); // new Person

Consumers

Consumers表现执行带有单个输入参数的操作。

Consumer greeter = (p) -> System.out.println("Hello, " + p.firstName);

greeter.accept(new Person("Luke", "Skywalker"));

Comparators

Comparators是从java旧版本升级并增加了一些缺省方法。

Comparator comparator = (p1, p2) -> p1.firstName.compareTo(p2.firstName);

Person p1 = new Person("John", "Doe");

Person p2 = new Person("Alice", "Wonderland");

comparator.compare(p1, p2); // > 0

comparator.reversed().compare(p1, p2); // < 0

Stream 常用方法

创建Stream

将现有数据结构转化成Stream

Stream s = Stream.of(1, 2, 3, 4, 5);

Stream s = Arrays.stream(arr);

Stream s = aList.stream();

通过Stream.generate()方法:

// 这种方法通常表示无限序列

Stream s = Stream.generate(SuppLier s);

// 创建全体自然数的Stream

class NatualSupplier implements Supplier {

BigInteger next = BigInteger.ZERO;

@Override

public BigInteger get() {

next = next.add(BigInteger.ONE);

return next;

}

}

通过其他方法返回

Stream lines = Files.lines(Path.get(filename))

...

map方法

把一种操作运算映射到Stream的每一个元素上,从而完成一个Stream到另一个Stream的转换

map方法接受的对象是Function接口,这个接口是一个函数式接口:

Stream map(Function super T, ? extends R> mapper);

@FunctionalInterface

public interface Function {

// 将T转换为R

R apply(T t);

}

使用:

// 获取Stream里每个数的平方的集合

Stream ns = Stream.of(1, 2, 3, 4, 5);

ns.map(n -> n * n).forEach(System.out::println);

flatMap

map方法是一个一对一的映射,每输入一个数据也只会输出一个值。

flatMap方法是一对多的映射,对每一个元素映射出来的仍旧是一个Stream,然后会将这个子Stream的元素映射到父集合中:

Stream> inputStream = Stream.of(Arrays.asList(1), Arrays.asList(2, 3), Arrays.asList(4, 5, 6));

List integerList = inputStream.flatMap((childList) -> childList.stream()).collect(Collectors.toList());

//将一个“二维数组”flat为“一维数组”

integerList.forEach(System.out::println);

filter方法

filter方法用于过滤Stream中的元素,并用符合条件的元素生成一个新的Stream。

filter方法接受的参数是Predicate接口对象,这个接口是一个函数式接口:

Stream filter(Predicate super T>) predicate;

@FunctionInterface

public interface Predicate {

// 判断元素是否符合条件

boolean test(T t);

}

使用

// 获取当前Stream所有偶数的序列

Stream ns = Stream.of(1, 2, 3, 4, 5);

ns.filter(n -> n % 2 == 0).forEach(System.out::println);

limit、skip

limit用于限制获取多少个结果,与数据库中的limit作用类似,skip用于排除前多少个结果。

sorted

sorted函数需要传入一个实现Comparator函数式接口的对象,该接口的抽象方法compare接收两个参数并返回一个整型值,作用就是排序,与其他常见排序方法一致。

distinct

distinct用于剔除重复,与数据库中的distinct用法一致。

findFirst

findFirst方法总是返回第一个元素,如果没有则返回空,它的返回值类型是Optional类型,接触过swift的同学应该知道,这是一个可选类型,如果有第一个元素则Optional类型中保存的有值,如果没有第一个元素则该类型为空。

Stream stream = users.stream();

Optional userID = stream.filter(User::isVip).sorted((t1, t2) -> t2.getBalance() - t1.getBalance()).limit(3).map(User::getUserID).findFirst();

userID.ifPresent(uid -> System.out.println("Exists"));

min、max

min可以对整型流求最小值,返回OptionalInt。

max可以对整型流求最大值,返回OptionalInt。

这两个方法是结束操作,只能调用一次。

allMatch、anyMatch、noneMatch

allMatch:Stream中全部元素符合传入的predicate返回 true

anyMatch:Stream中只要有一个元素符合传入的predicate返回 true

noneMatch:Stream中没有一个元素符合传入的predicate返回 true

reduce方法

reduce方法将一个Stream的每一个元素一次作用于BiFunction,并将结果合并。

reduce方法接受的方法是BinaryOperator接口对象。

Optional reduce(BinaryOperator accumulator);

@FuncationalInterface

public interface BinaryOperator extends BiFunction {

// Bi操作,两个输入,一个输出

T apply(T t, T u);

}

使用:

// 求当前Stream累乘的结果

Stream ns = Stream.of(1, 2, 3, 4, 5);

int r = ns.reduce( (x, y) -> x * y ).get();

System.out.println(r);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值