标签: java-stream

Java 8 Streams取String线的总和

如何使用Stream找到此行中所有整数的总和?

String line = "Test 15 lqlq 35 bad 99999 guess 34";

List<String> lineSplitted = Arrays.stream(line.split(" ")).collect(Collectors.toList());
int result = 0;
try {
    result = lineSplitted.stream().filter(s -> Integer.parseInt(s)).sum();
}
catch (Exception e) {

}
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

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

从流中获取字符串列表

我有一个包含字符串和字符串列表的流,我想把所有值作为字符串列表.无论如何用一些流操作来做到这一点?

Stream stream = Stream.of("v1", Arrays.asList("v2, v3"));
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

如何从Java8的spliterator中的tryAdvance方法返回值?

我是Java 8的新手,试图了解Java8的splitIterator功能。

我已经编写了以下代码,我的要求是每当我调用get()时;get方法应该从itr3返回一个值;是否有可能得到相同的?如何?

public class TestSplitIterator {

static List<Integer> list = new ArrayList<Integer>();

public static void main(String args[]) {

    for (int i = 0; i < 100; i++) {
        list.add(i);
    }
    // below method call should return only one value whenever i call it;
    get(list);
}

private static int get(List<Integer> list) {
    Collections.sort(list, Collections.reverseOrder());

    System.out.println(list);

    Spliterator<Integer> itr1 = list.spliterator();
    Spliterator<Integer> itr2 = itr1.trySplit();
    Spliterator<Integer> itr3 = itr2.trySplit();
    // i want to return value from itr3 whenever get(List list ic called) …
Run Code Online (Sandbox Code Playgroud)

java-8 java-stream

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

如何在搜索重复项时删除流中的第一个外观?

我有一个对象流,它根据它们拥有的id定义equals和hashcode.所以我知道使用stream.distinct()我会得到一个没有任何重复的流,但它会保留第一个外观,而不是最后一个.

这在文档中明确说明:

对于有序流,不同元素的选择是稳定的*(对于重复元素,将保留遇到*顺序中首先出现的元素.)

那么我怎么能有一个没有重复的流,但保持最后的外观呢?

例如,如果我有这个项目列表1,2,3,1,4,5.

如果我申请,distinct()我会得到1,2,3,4,5,我期待:2,3,1,4,5.我怎样才能做到这一点?

java java-8 java-stream

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

lambda表达式中的返回类型错误:谓词<T>无法转换为Criteria <T>

我有以下接口和类:

public interface Rule<T> {
   Predicate<T> evaluate();
}

public interface Criteria<T> {
   Predicate<T> evaluate();
}

public abstract class AbstractRule<T> implements Rule<T> {
   ...
   Set<Criteria<T>> criteria;
   ...

   @Override 
   @Nullable 
   public Predicate<T> evaluate() {
      return criteria.stream().reduce((c1, c2) -> c1.evaluate().and(c2.evaluvate()))
             .orElse(null);
   }
}
Run Code Online (Sandbox Code Playgroud)

AbstractRule类包含一组Criteria.我想通过评估每个标准来对规则进行评估.我在标题中提到的c1.evaluate().和(c2.evaluate())上遇到了编译错误.

我该如何解决这个问题?

谢谢.

java java-8 java-stream

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

流API收集方法编译错误 - 对象无法强制转换为List

我看不出我的流api逻辑有什么问题.它告诉我以下内容

[ERROR] mystuff/MandantContentFetcher.java:[67,23]不兼容的类型:java.lang.Object无法转换为java.util.List

这是我的流方法:

static List<MandantLinkCheckerEntry> createMandantLinkCheckerEntries(Struct struct) {
    Map<String, Object> linkCheckerMandants = struct.toNestedMaps();
    return linkCheckerMandants.values().parallelStream()
            .map(Map.class::cast)
            .map(MandantLinkCheckerEntry::convertMapToMandantCheckerEntry)
            .collect(Collectors.toList());
  }
Run Code Online (Sandbox Code Playgroud)

它使用此方法参考:

  private static MandantLinkCheckerEntry convertMapToMandantCheckerEntry(Map<String, Object> entryToConvert) {
    return new MandantLinkCheckerEntry(String.valueOf(entryToConvert.get("mandant.path")),
            String.valueOf(entryToConvert.get("mail.to")),
            Boolean.valueOf(String.valueOf(entryToConvert.get("active"))));
  }
Run Code Online (Sandbox Code Playgroud)

他为什么看到一个物体?第二个映射中的方法引用确实返回MandantLinkCheckerEntry.另外我假设collect确实创建了一个List,其中流的值是泛型类型,但似乎他转换了流的类型(这里的Object是Stream启动器Map<String, Object).我该如何帮助他将其投入到列表中?

java java-stream

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

为什么Stream API中没有flatten()方法?

以下两个代码段产生相同的结果.

用flatMap:

Stream.iterate(2, n -> n + 4)
            .flatMap(n -> Stream.of(n, -(n + 2)));
Run Code Online (Sandbox Code Playgroud)

随着map其次是flatMap使用identity:

Stream.iterate(2, n -> n + 4)
            .map(n -> Stream.of(n, -(n + 2)))
            .flatMap(Function.identity());
Run Code Online (Sandbox Code Playgroud)

因此flatten,在Stream接口中包含无参数方法(如Scala的Stream)似乎很自然,允许将前面的示例写成:

Stream.iterate(2, n -> n + 4)
            .map(n -> Stream.of(n, -(n + 2)))
            .flatten();
Run Code Online (Sandbox Code Playgroud)

那么为什么API中没有flatten()方法Stream呢?

java-8 java-stream

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

映射后的Java Stream to Array

我有以下代码,这是我偶然发现的一个简化版本:

public class Transforming
{
    static interface MyInterface<T>
    {
        void consume(T... toConsume);
    }

    static abstract class Mapper<T> implements MyInterface<String> {
        MyInterface<T> delegate;

        public Mapper(MyInterface<T> delegateTo)
        {
            delegate = delegateTo;
        }

        public void consume(String... transformFrom)
        {
            T[] array = (T[]) Arrays.stream(transformFrom)
                    .map(this::transform)
                    .toArray(); // can't toArray(T[]::new) here!
            delegate.consume(array);
        }

        protected abstract T transform(String toTransform);
    }
}
Run Code Online (Sandbox Code Playgroud)

关于如何将流转换为数组的搜索明显不足,因为此时我没有生成的数组类型,并且Java不允许我创建泛型类型的数组...

我确实理解这个问题,但有关如何清理代码的任何输入?AFAICT,我的选择是

  • 将接口从varargs更改为List
  • 我在代码示例中使用的演员
  • 向Mapper创建添加IntFunction

我缺少什么?你最喜欢什么?

java arrays generics java-stream

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

为什么Combiner不影响输出?

以下代码输出始终为24.

public static void main(String[] args) throws InterruptedException {
    List<String> list = new ArrayList<String>();
    list.add("java");
    list.add("php");
    list.add("python");
    list.add("perl");
    list.add("c");
    list.add("lisp");
    list.add("c#");
    int s = list.stream().reduce(0, (x, y) -> x + y.length(), (x, y) -> 0);
    System.out.println(s);
    s = list.stream().reduce(0, (x, y) -> x + y.length(), (x, y) -> x - y);
    System.out.println(s);
    s = list.stream().reduce(0, (x, y) -> x + y.length(), (x, y) -> x * y);
    System.out.println(s);

}   
Run Code Online (Sandbox Code Playgroud)

问题是组合器影响我的代码的原因.

java java-8 java-stream

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

使用Java中的流的byte []到byte []的ArrayList

我有一个byte []的ArrayList,我想知道是否可以使用Java*中的流将其转换为byte [].ArrayList中的所有数组都具有相同的大小.

ArrayList<byte[]> buffer = new ArrayList();

byte[] output = buffer.stream(...)
Run Code Online (Sandbox Code Playgroud)

java java-stream

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

标签 统计

java-stream ×10

java ×8

java-8 ×7

arrays ×1

generics ×1

lambda ×1