Java8 的Stream 除了limit有没有自定义发方法截断流?

hong_derek 2018-09-14 01:33:35
例如:
Stream<Integer> streamInt = Stream.iterate(0, x -> x + 2);
streamInt.limit(100).forEach(i -> {
System.out.println(i);
});
一个无限流,前100个截断
...全文
781 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hong_derek 2018-10-08
  • 打赏
  • 举报
回复
从结果看这个方法是可以的,可惜用了一个List过度,并不完美
zoujiawei6 2018-09-28
  • 打赏
  • 举报
回复
上面打了错别字,是“取出”不是“去除”
zoujiawei6 2018-09-28
  • 打赏
  • 举报
回复 1
如果你是想去除小于50的全部数据,将之放入一个新的List即可:
	public static void main(String[] args) {
		Stream<Integer> streamInt = Stream.iterate(0, x -> x + new Random().nextInt(10));
		List<Integer> newList = new ArrayList<Integer>();
		streamInt.filter(x -> {
			if (x >= 50) {
				return true;
			} else {
				newList.add(x);
				return false;
			}
		})
		.limit(1)
		.forEach(i -> {
			System.out.println(i);
		});
		System.out.println(newList);
	}
zoujiawei6 2018-09-28
  • 打赏
  • 举报
回复
你貌似搞错了先后顺序,limit如在filter之后,那只有filter出来的数据达到了limit的要求才会触发limit阶段。 在X>=50时就停止,即只要有一个数字达到了X>=50的要求就阶段,那么此时limit(1)即可。 是不是这个意思:
	public static void main(String[] args) {
		Stream<Integer> streamInt = Stream.iterate(0, x -> x + new Random().nextInt(10));
		streamInt.filter(x -> x >= 50)
		.limit(1)
		.forEach(i -> {
			System.out.println(i);
		});
		System.out.println("finish");
	}
zoujiawei6 2018-09-26
  • 打赏
  • 举报
回复
比如我不要包含2的前100个数字:

	public static void main(String[] args) {
		Stream<Integer> streamInt = Stream.iterate(0, (x) -> {
			return x + 1;
		});
		streamInt.filter((x) -> {
			String str = x.toString();
			return str.indexOf("2") == -1;
		}).limit(100).forEach(i -> {
			System.out.println(i);
		});
	}
steam不会傻傻的全部遍历完,一旦符合要求就会结束。这种情况下就够用了啊。 我看了下,steam的官方实现都是default权限,自己实现一般人就不用想了...
hong_derek 2018-09-26
  • 打赏
  • 举报
回复
引用 3 楼 zoujiawei6 的回复:
自定义?自定义截断规则吗?用filter过滤后截断或者截断后再过滤不就好了。实在用的不爽就继承重写呗。
Stream是个接口,没找到具体实现,没办法重写。除非自己实现一个
hong_derek 2018-09-26
  • 打赏
  • 举报
回复
引用 3 楼 zoujiawei6 的回复:
自定义?自定义截断规则吗?用filter过滤后截断或者截断后再过滤不就好了。实在用的不爽就继承重写呗。
这个的确是个思路,可是有些场景是不确定截断数量的。比如上面例子里面的当x满足某个条件时停止循环,但这个条件只于值相关,和已获取的数量无关,就无法limit。
icarusliu81 2018-09-26
  • 打赏
  • 举报
回复
Stream没有办法使用在这种场景下;它包含有两种操作:一是中间操作;二是终止操作;在最终调用的终止操作前所有定义的操作序列都不会真正的执行。在你说的这种场景下,需要前面的筛选操作全部执行完产生了序列数之后再执行终止操作,与Stream的适应场景明显不符合。
hong_derek 2018-09-26
  • 打赏
  • 举报
回复
重新写个例子,比如无限流的数字是每个数字是随机增加的。这样我需要在X>=50时就停止。所以不确定产生个数 如果这样写: Stream<Integer> streamInt = Stream.iterate(0, x -> x + new Random().nextInt(10)); streamInt.filter(x -> x < 50).forEach(i -> { System.out.println(i); }); System.out.println("finish"); 因为是个无限流就会无限循环下去 但是又没办法写limit,去截断,因为不知道会产生多少个数字
zoujiawei6 2018-09-19
  • 打赏
  • 举报
回复
自定义?自定义截断规则吗?用filter过滤后截断或者截断后再过滤不就好了。实在用的不爽就继承重写呗。
hong_derek 2018-09-17
  • 打赏
  • 举报
回复
引用 1 楼 Bleating 的回复:
limit方法可以返回从任何数据源读取的数据吗?(你的问题我不太懂,我是刚学没多久学的很不仔细)

只要是Java8的Stream接口都可以,Java8的集合类都支持Stream
老飞侠yll 2018-09-14
  • 打赏
  • 举报
回复
limit方法可以返回从任何数据源读取的数据吗?(你的问题我不太懂,我是刚学没多久学的很不仔细)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧