标签: java-stream

是否有一种简洁的方法来迭代Java 8中的索引流?

有没有一种简洁的方法来迭代流,同时有权访问流中的索引?

String[] names = {"Sam","Pamela", "Dave", "Pascal", "Erik"};

List<String> nameList;
Stream<Integer> indices = intRange(1, names.length).boxed();
nameList = zip(indices, stream(names), SimpleEntry::new)
        .filter(e -> e.getValue().length() <= e.getKey())
        .map(Entry::getValue)
        .collect(toList());
Run Code Online (Sandbox Code Playgroud)

与那里给出的LINQ示例相比,这似乎相当令人失望

string[] names = { "Sam", "Pamela", "Dave", "Pascal", "Erik" };
var nameList = names.Where((c, index) => c.Length <= index + 1).ToList();
Run Code Online (Sandbox Code Playgroud)

有更简洁的方法吗?

此外,看起来拉链已移动或被移除......

java java-8 java-stream

361
推荐指数
10
解决办法
24万
查看次数

如何用java流汇总整数列表?

我想总结一个整数列表.它的工作原理如下,但语法感觉不对.代码可以优化吗?

Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

338
推荐指数
9
解决办法
34万
查看次数

Collectors.toMap中的Java 8 NullPointerException

如果其中一个值为'null' ,Java 8 Collectors.toMap将抛出一个NullPointerException.我不明白这种行为,map可以包含null指针作为值而没有任何问题.有没有一个很好的理由为什么值不能为空Collectors.toMap

另外,是否有一个很好的Java 8方法来修复它,或者我应该恢复到普通的旧循环?

我的问题的一个例子:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


class Answer {
    private int id;

    private Boolean answer;

    Answer() {
    }

    Answer(int id, Boolean answer) {
        this.id = id;
        this.answer = answer;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Boolean getAnswer() {
        return answer;
    }

    public void setAnswer(Boolean answer) {
        this.answer = answer;
    }
}

public class Main …
Run Code Online (Sandbox Code Playgroud)

java nullpointerexception java-8 java-stream collectors

292
推荐指数
7
解决办法
7万
查看次数

Collection.stream().forEach()和Collection.forEach()有什么区别?

据我所知.stream(),我可以使用链操作.filter()或使用并行流.但是如果我需要执行小操作(例如,打印列表的元素),它们之间的区别是什么?

collection.stream().forEach(System.out::println);
collection.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

java collections java-8 java-stream

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

如何从Java 8流中抛出CHECKED异常?

如何从Java 8流/ lambdas中抛出CHECKED异常?

换句话说,我想像这样编译代码:

public List<Class> getClasses() throws ClassNotFoundException {     

    List<Class> classes = 
        Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String")
              .map(className -> Class.forName(className))
              .collect(Collectors.toList());                  
    return classes;
    }
Run Code Online (Sandbox Code Playgroud)

此代码无法编译,因为Class.forName()上面的方法抛出ClassNotFoundException,检查.

请注意我不希望将已检查的异常包装在运行时异常中,而是抛出包装的未经检查的异常.我想抛出已检查的异常本身,而不是向流添加丑陋的try/ catches.

java lambda checked-exceptions java-8 java-stream

270
推荐指数
10
解决办法
11万
查看次数

为什么Stream <T>没有实现Iterable <T>?

在Java 8中,我们有Stream <T>类,它奇怪地有一个方法

Iterator<T> iterator()
Run Code Online (Sandbox Code Playgroud)

所以你会期望它实现接口Iterable <T>,这需要完全这个方法,但事实并非如此.

当我想使用foreach循环遍历Stream时,我必须做类似的事情

public static Iterable<T> getIterable(Stream<T> s) {
    return new Iterable<T> {
        @Override
        public Iterator<T> iterator() {
            return s.iterator();
        }
    };
}

for (T element : getIterable(s)) { ... }
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?

java iterable java-8 java-stream

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

Java 8方法参考:提供能够提供参数化结果的供应商

我想用

java.util.Optional.orElseThrow()
Run Code Online (Sandbox Code Playgroud)

使用Exception类型请求构造函数参数.像这样的东西:

orElseThrow(MyException::new(someArgument)) // obviously NOT working
Run Code Online (Sandbox Code Playgroud)

有没有办法创建一个传递我的参数值的供应商?

java java-8 java-stream

242
推荐指数
3
解决办法
10万
查看次数

为什么Java Streams一次性关闭?

与C#不同IEnumerable,执行管道可以根据需要执行多次,在Java中,流只能"迭代"一次.

对终端操作的任何调用都会关闭流,使其无法使用.这个"功能"消耗了很多力量.

我想这个的原因不是技术性的.这个奇怪限制背后的设计考虑是什么?

编辑:为了演示我在说什么,请考虑以下C#中的Quick-Sort实现:

IEnumerable<int> QuickSort(IEnumerable<int> ints)
{
  if (!ints.Any()) {
    return Enumerable.Empty<int>();
  }

  int pivot = ints.First();

  IEnumerable<int> lt = ints.Where(i => i < pivot);
  IEnumerable<int> gt = ints.Where(i => i > pivot);

  return QuickSort(lt).Concat(new int[] { pivot }).Concat(QuickSort(gt));
}
Run Code Online (Sandbox Code Playgroud)

现在可以肯定的是,我并不是说这是一个很好的快速排序!然而,它是lambda表达式与流操作相结合的表达能力的一个很好的例子.

它不能用Java完成!我甚至无法询问流是否为空而不使其无法使用.

java api-design java-8 java-stream

231
推荐指数
4
解决办法
4万
查看次数

使用流生成地图时忽略重复项

Map<String, String> phoneBook=people.stream()
                                    .collect(toMap(Person::getName, Person::getAddress));
Run Code Online (Sandbox Code Playgroud)

重复发生时,我得到重复的密钥异常.

是否可以忽略在重复发生时将值添加到映射?

当存在重复时,它应该继续忽略该重复键.

java java-8 java-stream

226
推荐指数
3
解决办法
10万
查看次数

在Stream :: flatMap中使用Java 8的Optional

新的Java 8流框架和朋友们制作了一些非常简洁的Java代码,但是我遇到了一个看似简单的情况,简单易懂.

考虑一个List<Thing> things方法Optional<Other> resolve(Thing thing).我想将Things 映射到Optional<Other>s并获得第一个Other.显而易见的解决方案是使用things.stream().flatMap(this::resolve).findFirst(),但flatMap要求您返回一个流,并且Optional没有stream()方法(或者它是Collection一个方法或提供将其转换为或以其方式查看的方法Collection).

我能想到的最好的是:

things.stream()
    .map(this::resolve)
    .filter(Optional::isPresent)
    .map(Optional::get)
    .findFirst();
Run Code Online (Sandbox Code Playgroud)

但这似乎是一个非常普遍的案例,似乎非常冗长.谁有更好的主意?

java lambda java-8 java-stream

221
推荐指数
7
解决办法
13万
查看次数