相关疑难解决方法(0)

带有索引的Java 8 forEach

有没有办法forEach在Java 8中构建一个使用索引进行迭代的方法?理想情况下,我喜欢这样的事情:

params.forEach((idx, e) -> query.bind(idx, e));
Run Code Online (Sandbox Code Playgroud)

我现在能做的最好的事情是:

int idx = 0;
params.forEach(e -> {
  query.bind(idx, e);
  idx++;
});
Run Code Online (Sandbox Code Playgroud)

java foreach for-loop java-8

129
推荐指数
3
解决办法
18万
查看次数

Stream Way获取匹配boolean的第一个元素的索引

我有一个List<Users>.我想用特定的用户名获取流中(第一个)用户的索引.我不想竟要求User.equals()一些描述User,只是为了有相同的用户名.

我可以想到这样做的丑陋方法(迭代和计数),但感觉应该有一个很好的方法来做到这一点,可能是通过使用Streams.到目前为止,我所拥有的最好的是:

int index = users.stream()
    .map(user -> user.getName())
    .collect(Collectors.toList())
    .indexOf(username);
Run Code Online (Sandbox Code Playgroud)

这不是我写过的最糟糕的代码,但它并不好.它也不是那么灵活,因为它依赖于一个带有.equals()描述你正在寻找的属性的函数的类型的映射函数; 我宁愿有一些可以随心所欲的东西Function<T, Boolean>

谁知道怎么样?

java java-8 java-stream

40
推荐指数
5
解决办法
5万
查看次数

使用流API查找列表中项目的所有索引

我正在尝试使用Java 8流和lambda表达式进行顺序搜索.这是我的代码

List<Integer> list = Arrays.asList(10, 6, 16, 46, 5, 16, 7);
int search = 16;
list.stream().filter(p -> p == search).forEachOrdered(e -> System.out.println(list.indexOf(e)));
Run Code Online (Sandbox Code Playgroud)
Output: 2
        2
Run Code Online (Sandbox Code Playgroud)

我知道list.indexOf(e)总是打印第一次出现的索引.如何打印所有索引?

java lambda list java-8

16
推荐指数
1
解决办法
2万
查看次数

在Java 8流中没有索引的原因是什么?

我想知道Java 8流(Stream<E>),他们有以下方法:

  • forEach(Consumer<? super E> action)
  • forEachOrdered(Consumer<? super E> action)

反对不提供以下签名的论点是什么?

  • forEachOrdered(BiConsumer<Integer, ? super E> action)
    • 然后,它将返回流中项目的索引和项目本身.

有了这个重载,就可以在订购流的情况下实际使用索引.

我真的很想知道反对它的论点是什么.

编辑,同样的实际持有的Iterator<E>forEachRemaining,甚至更多的类.
如果没有类提供这样的选项,那么我怀疑它已被考虑用于Java 8并被拒绝.

java java-8 java-stream

10
推荐指数
2
解决办法
1111
查看次数

如何跳过从Files.lines获得的Stream <String>的偶数行

在这种情况下,只有奇数行具有有意义的数据,并且没有唯一标识这些行的字符.我的目的是获得与以下示例等效的内容:

Stream<DomainObject> res = Files.lines(src)
     .filter(line -> isOddLine())
     .map(line -> toDomainObject(line))
Run Code Online (Sandbox Code Playgroud)

没有共享全球状态,有没有"干净"的方式去做?

java-8 java-stream

10
推荐指数
2
解决办法
1358
查看次数

流操作应用于列表元素的顺序是什么?

假设我们有一个标准的流操作方法链:

Arrays.asList("a", "bc", "def").stream()
  .filter(e -> e.length() != 2)
  .map(e -> e.length())
  .forEach(e -> System.out.println(e));
Run Code Online (Sandbox Code Playgroud)

JLS中是否有关于流操作应用于列表元素的顺序的保证?

例如,是否保证:

  1. 在应用过滤谓词"bc"之前,不会发生应用过滤谓词"a"
  2. 在应用映射函数"def"之前,应用映射函数是不会发生的"a"
  3. 1将在之前打印3

注意:我在这里专门讨论stream(),而不是 parallelStream()预期映射和过滤等操作并行完成的地方.

java java-8 java-stream

10
推荐指数
1
解决办法
1846
查看次数

如何在java 8中获取findFirst()的索引?

我有以下代码:

ArrayList <String> entries = new ArrayList <String>();

entries.add("0");
entries.add("1");
entries.add("2");
entries.add("3");

String firstNotHiddenItem = entries.stream()
                    .filter(e -> e.equals("2"))
                    .findFirst()
                    .get();
Run Code Online (Sandbox Code Playgroud)

我需要知道第一个返回元素的索引是什么,因为我需要在条目内编辑它ArrayList.据我所知,get()返回元素的值,而不是引用.我应该使用

int indexOf(Object o)
Run Code Online (Sandbox Code Playgroud)

代替?

java java-8 java-stream

8
推荐指数
2
解决办法
5237
查看次数

从流中收集某些元素

如何通过位置从Stream中提取两个元素?例如,我试图从a中提取元素0和1(这些数字是任意的!)Stream<String>.一个天真的方法是:

List<String> strings = Arrays.asList("s0", "s1", "s2", "s3", "s4");
Consumer<String> c0 = s -> System.out.println("c0.accept(" + s + ")");
Consumer<String> c1 = s -> System.out.println("c1.accept(" + s + ")");
strings.stream().skip(0).peek(c0).skip(1).peek(c1).findAny();
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出:

c0.accept(s0)
c0.accept(s1)
c1.accept(s1)
Run Code Online (Sandbox Code Playgroud)

我明白这是因为s0它将进入流,遇到skip(0),然后peek(c0)(它给出第一行)然后skip(1),它将跳过这个元素,然后显然继续从流的开头的下一个元素.

我以为我可以使用这些消费者来提取字符串,但c0会被第二个元素覆盖:

String[] extracted = new String[2];
c0 = s -> extracted[0];
c1 = s -> extracted[1];
Run Code Online (Sandbox Code Playgroud)

编辑:

这些是流的特征:

  • 只有一个流,而不是列表或数组
  • 流可能是无限的
  • 流可以按顺序进行

java java-8 java-stream

6
推荐指数
1
解决办法
469
查看次数

如何在循环中增加Java 8 lambda表达式中的"数字"?

我有以下问题.我有一个从1开始的整数位置,并且每次在xml中的特定位置找到来自txt的特定人时递增.如果我使用foreach的经典迭代for (PersonMatchInfo pmi : personMatchInfo)它可以工作,但我的高级要求我使用Java 8 foreach,这种类型的迭代只适用于最终变量.如何在新的Java 8循环中增加整数?谢谢.

int position = 1;
personMatchInfo.forEach(pmi ->{

                    if (!stopwatch1.isStarted()) {
                        stopwatch1.start();
                    } else if (stopwatch1.isStarted()) {

                    }

                    if (pmi.getPersonName().equals(e.getValue())) {

                        positionMap.put(position, positionMap.get(position) + 1);
                        break;

                    } else {

                        position++;
                    }
                });
Run Code Online (Sandbox Code Playgroud)

java

6
推荐指数
1
解决办法
1万
查看次数

使用Java Streams统计和打印一个链中的唯一列表项

我试图仅使用功能性的编程构造(流,收集器,lambda表达式)来实现这一点。

假设list是一个String[]

{"Apple", "Samsung", "LG", "Oppo", "Apple", "Huawei", "Oppo"}
Run Code Online (Sandbox Code Playgroud)

我想从此数组中打印出不同的品牌名称列表,并为其编号,即:

1. Apple
2. Huawei
3. LG
4. Oppo
5. Samsung
Run Code Online (Sandbox Code Playgroud)

我可以打印出独特的元素(排序):

Stream.of(list)
    .distinct()
    .sorted()
    .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

但这没有显示前面的计数器。我尝试过,Collectors.counting()但是那当然没有用。

FP专家有什么帮助吗?


编辑:我理解有关在带索引的流上进行迭代的其他一些问题。但是,我不能简单地做:

IntStream.range(0, list.length)
        .mapToObj(a -> (a+1) + ". " + list[a])
        .collect(Collectors.toList())
        .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

因为原始数组包含重复元素。在打印结果之前,可能还会有其他情况,map并且filter可能需要在流上执行。

java functional-programming java-stream

6
推荐指数
1
解决办法
127
查看次数