Java8新特性-Stream,java常用算法面试题

本文详细介绍了Java8的Stream API,包括如何创建无限流、空流,无状态与有状态操作的区别,以及各种操作如filter、map、distinct、sorted等的用法。此外,还讨论了短路操作、Optional类型、原始类型流和并行流的使用。通过实例展示了Stream在实际编程中的应用,是理解Java8 Stream特性的绝佳参考资料。
摘要由CSDN通过智能技术生成

Stream stream = Stream.iterate(0, x -> x + 2).limit(3);

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

}

输出结果

0

2

4

创建无限流

@Test

public void testUnlimitStream2() {

Stream stream = Stream.generate(() -> “number” + new Random().nextInt()).limit(3);

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

}

输出结果

number1042047526

number-155761434

number-1605164634

创建空流

@Test

public void testEmptyStream() {

Stream stream = Stream.empty();

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

}

Stream操作分类


  • 中间操作又可以分为无状态(Stateless)与有状态(Stateful)操作,

  • 无状态是指元素的处理不受之前元素的影响,

  • 有状态是指该操作只有拿到所有元素之后才能继续下去。

  • 终结操作又可以分为短路(Short-circuiting)与非短路(Unshort-circuiting)操作,

  • 短路是指遇到某些符合条件的元素就可以得到最终结果,

  • 非短路是指必须处理完所有元素才能得到最终结果。

  • 我们通常还会将中间操作称为懒操作,也正是由这种懒操作结合终结操作数据源构成的处理管道(Pipeline)实现了 Stream 的高效

中间操作


无状态

  • filter:过滤流,过滤流中的元素

  • map:转换流,将一种类型的流转换为另外一种类型的流

  • flapMap:拆解流,将流中每一个元素拆解成一个流

filter

filter接收一个Predicate函数接口参数,boolean test(T t);即接收一个参数,返回boolean类型。

@Test

public void testFilter() {

Integer[] arr = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Arrays.stream(arr).filter(x -> x > 3 && x < 8).forEach(System.out::println);

}

输出结果

4

5

6

7

map

map接收一个Function<T, R>函数接口,R apply(T t);即接收一个参数,并且有返回值。

@Test

public void testMap() {

String[] arr = new String[]{“yes”, “YES”, “no”, “NO”};

Arrays.stream(arr).map(x -> x.toLowerCase()).forEach(System.out::println);

}

输出结果

yes

yes

no

no

flapMap

flatMap接收一个Function<T, R>函数接口: Stream flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);即入参为集合类型,返回Stream类型。

@Test

public void testFlatMap() {

String[] arr1 = {“a”, “b”};

String[] arr2 = {“e”, “f”};

String[] arr3 = {“h”, “j”};

// Stream.of(arr1, arr2, arr3).flatMap(x -> Arrays.stream(x)).forEach(System.out::println);

Stream.of(arr1, arr2, arr3).flatMap(Arrays::stream).forEach(System.out::println);

}

输出结果

a

b

e

f

h

j

有状态

  • distinct:元素去重

  • sorted:元素排序

  • limit:获取前面的指定数量的元素

  • skip:跳过前面指定数量的元素,获取后面的元素

  • concat:把两个stream合并成一个stream

distinct

@Test

public void testDistinct() {

List list = new ArrayList() {

{

add(“user1”);

add(“user2”);

add(“user2”);

add(“user2”);

}

};

list.stream().distinct().forEach(System.out::println);

}

输出结果

user1

user2

sorted
sorted

@Test

public void testSorted1() {

String[] arr1 = {“abc”, “a”, “bc”, “abcd”};

// 按照字符长度排序

System.out.println(“lambda表达式”);

Ar

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值