有没有办法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) 我有一个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 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 8流(Stream<E>),他们有以下方法:
forEach(Consumer<? super E> action)forEachOrdered(Consumer<? super E> action)反对不提供以下签名的论点是什么?
forEachOrdered(BiConsumer<Integer, ? super E> action)
有了这个重载,就可以在订购流的情况下实际使用索引.
我真的很想知道反对它的论点是什么.
编辑,同样的实际持有的Iterator<E>有forEachRemaining,甚至更多的类.
如果没有类提供这样的选项,那么我怀疑它已被考虑用于Java 8并被拒绝.
在这种情况下,只有奇数行具有有意义的数据,并且没有唯一标识这些行的字符.我的目的是获得与以下示例等效的内容:
Stream<DomainObject> res = Files.lines(src)
.filter(line -> isOddLine())
.map(line -> toDomainObject(line))
Run Code Online (Sandbox Code Playgroud)
没有共享全球状态,有没有"干净"的方式去做?
假设我们有一个标准的流操作方法链:
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中是否有关于流操作应用于列表元素的顺序的保证?
例如,是否保证:
"bc"之前,不会发生应用过滤谓词"a"?"def"之前,应用映射函数是不会发生的"a"?1将在之前打印3?注意:我在这里专门讨论stream(),而不是 parallelStream()预期映射和过滤等操作并行完成的地方.
我有以下代码:
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)
代替?
如何通过位置从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)
编辑:
这些是流的特征:
我有以下问题.我有一个从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) 我试图仅使用功能性的编程构造(流,收集器,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可能需要在流上执行。