检查forEach lambda循环Java 8中列表的范围

检查forEach lambda循环Java 8中列表的范围,java,foreach,lambda,java-8,Java,Foreach,Lambda,Java 8,我想学习如何在Java8中检查列表的范围 比如说, 我的代码: List<String> objList = new ArrayList<>(); objList.add("Peter"); objList.add("James"); objList.add("Bart"); objList.stream().map((s) -> s + ",").forEach(System.out::print); 但我想知道怎样才能

我想学习如何在Java8中检查列表的范围

比如说,

我的代码:

    List<String> objList = new ArrayList<>();
    objList.add("Peter");
    objList.add("James");
    objList.add("Bart");

    objList.stream().map((s) -> s + ",").forEach(System.out::print);
但我想知道怎样才能摆脱最后一个

注意:我知道我必须在这里使用过滤器,但我不知道如何使用,我知道还有另一种方法可以解决这个问题,如下所示

String result = objList.stream()
    .map(Person::getFirstName)
    .collect(Collectors.joining(","));
然而,我想知道如何在我的第一段代码中检查范围并去掉它。

objList.stream().filter(s -> { return !s.equals("Bart") })
这会将流减少为不等于Bart的字符串

这将打印地图的最后一个值:

Map<Integer, String> map = new HashMap<>();
map.put(0, "a");
map.put(1, "c");
map.put(2, "d");

Integer lastIndex = map.keySet().size() - 1;

Stream<String> lastValueStream = map.values().stream().filter(s -> s.equals(map.get(lastIndex)));
Map Map=newhashmap();
图.put(0,“a”);
地图.付诸表决(1,“c”);
图.put(2,“d”);
整数lastIndex=map.keySet().size()-1;
Stream lastValueStream=map.values().Stream().filter(s->s.equals(map.get(lastIndex));
关于:

String concat = objList.stream().reduce(",", String::concat);
System.out.println(concat);
您可以这样做:

objList.stream().flatMap((s) -> Stream.of(s, ','))
        .limit(objList.size() * 2 - 1).forEach(System.out::print);
用映射函数返回的流中的元素替换原始流的每个元素

因此,如果您的流最初是

"Peter" - "James" - "Bart"
上面的映射函数将其更改为

"Peter" - "," - "James" - "," - "Bart" - ","
然后删除最后一个
“,”
,方法是将流缩短为最多传递给它的值的长度,在本例中为流的大小-1。流的大小是
limit
之前列表的2*大小,因为
flatMap
将其长度增加了一倍


请注意,如果列表为空,这将抛出一个
IllegalArgumentException
,因为传递给
limit
的值将为-1。如果可能的话,您应该先检查一下。在处理流项目本身时,没有直接的方法来获取流项目的索引。不过,有几种选择

一种方法是在索引上运行流,然后从列表中获取元素。对于每个元素索引,它将
i
映射到第i个元素,并为除最后一个之外的所有索引添加“,”

IntStream.range(0, objList.size())
    .mapToObj(i -> objList.get(i) + (i < objList.size()-1 ? "," : ""))
    .forEach(System.out::print);
System.out.print(objList.get(0));
objList.stream()
    .skip(1)
    .map(s -> "," + s)
    .forEach(System.out::print);
第三种方法是使用特定的
reduce
操作,该操作在两个相邻元素之间应用。这种技术的问题是它不进行O(n^2)复制,这对于大数据流来说会变得非常慢

System.out.println(objList.stream().reduce((a,b) -> a + "," + b).get());
第四种方法是通过将流的长度限制为n-1来对最后一个元素进行特殊处理。这需要一个单独的print语句,但它没有那么漂亮:

objList.stream()
    .limit(objList.size()-1)
    .map(s -> s + ",")
    .forEach(System.out::print);
System.out.print(objList.get(objList.size()-1));
第五种方式与上述方式类似,将第一种元件(而非最后一种元件)作为特殊外壳:

IntStream.range(0, objList.size())
    .mapToObj(i -> objList.get(i) + (i < objList.size()-1 ? "," : ""))
    .forEach(System.out::print);
System.out.print(objList.get(0));
objList.stream()
    .skip(1)
    .map(s -> "," + s)
    .forEach(System.out::print);

实际上,尽管加入收集器的目的是为您制作这个丑陋且令人恼火的特殊外壳,所以您不必自己动手。

我们也可以尝试使用流API的限制和跳过方法来解决这个问题。下面是我对这个问题的尝试

    returnData.stream().limit(returnData.size()-1).forEach(s->System.out.print(s+","));
    returnData.stream().skip(returnData.size()-1).forEach(s->System.out.print(s));
returnData是值为2,4,7,14的整数列表。输出看起来像2,4,7,14

int[] counter = new int[]{0};
objList.stream()
    .map(f -> (counter[0]++ > 0? "," : "") + f)
    .forEach(System.out::print);


看在上帝的份上,当你否决它的时候,请说为什么?这个问题怎么了?。。。什么?你有什么困惑吗?没有,例如在命令式中,很清楚如何检查范围,但在这里我不知道。我只想扔掉最后一道菜你知道巴特是最后一道菜吗?我想要一些东西,如果你想处理精确的位置,你必须使用地图——例如,键是数字,值是字符串。具有最高值的键将生成您的最后一个map-value。请您在答案中通读您的代码,以便我可以运行它吗?我相当确定我的小示例将按原样运行。。。。但既然你问得很好,我实际上会在我的工作场所使用我的开发环境来测试它。。。请稍等,不要用你的密码。我在评论部分谈论你的代码谢谢你的回答但你能帮我找到一种方法来解决这个问题吗?PeterJamesBart是我得到的,它是错误的,你能解释一下flatMap吗?“Peter”,“,你能告诉我逗号加上和不加上QOUTIONS有什么区别吗?没有引号是为了分隔元素,它们不在流中。有趣的是,它是如何删除的?为什么要多加两个?我接受了你的答案,因为它更接近我要找的,但我有一个问题。在地图处理过程中,我如何能够同时访问第一个和第二个元素?@user3674428如果您正在流式传输列表本身的元素,则不能。如果您有一个列表,您可以使用
IntStream.range
创建索引流,然后在映射器中使用
list.get(i)
list.get(i+1)
。感谢您的回复。我有一些想法,你可以检查我的另一个帖子,这是相关的,并帮助我解决这个?这是k,但谢谢你。你的回答把我引向那个问题,所以我也要非常感谢你有什么方法可以通过电子邮件与您联系吗?
if(returnData.size()>0){returnData.stream().limit(returnData.size()-1).forEach(s->System.out.print(s+“,”);returnData.stream().skip(returnData.size()-1).forEach(s->System.out.print(s));}