相关疑难解决方法(0)

使用带有lambda的JDK8压缩流(java.util.stream.Streams.zip)

在带有lambda b93的JDK 8中,b93中有一个类java.util.stream.Streams.zip可用于压缩流(这在教程Exploring Java8 Lambdas中说明.Dhananjay Nene的第1部分).这个功能:

创建一个惰性和顺序组合Stream,其元素是组合两个流的元素的结果.

然而在b98中,这已经消失了.事实上,在b98Streams中的java.util.stream中甚至无法访问该类.

是否已移动此功能,如果是这样,我如何使用b98简洁地压缩流?

我想到的应用程序是在Shen的这个java实现中,我在其中替换了zip中的zip功能

  • static <T> boolean every(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)
  • static <T> T find(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)

具有相当冗长代码的函数(不使用b98中的功能).

lambda functional-programming lazy-evaluation java-8 java-stream

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

在Java8中将两个ArrayLists相乘和求和

我有两个名为A和B的ArrayLists,大小相等,包含一些数字.现在我要计算这样的事情:

int sum = 0;
for(int i=0; i<A.size() && i<B.size(); i++) {
  sum += A.get(i)*B.get(i);
}
Run Code Online (Sandbox Code Playgroud)

如何在不使用任何额外的用户定义方法的情况下,通过使用Java 8功能(流,lambda表达式等)来实现上面的工作,计算总和?

java java-8 java-stream

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

将 Java8 流数组转换为元组流

假设我有一个 Java 8 流数组:Stream<T>[] streams,我想创建一个 Stream,其中新流的每个元素都是一个数组,由从每个初始基本流中选取一个元素组成(假设它们都是连续的) )。

例如,如果我有:

  streams [ 0 ] returning: ( "A", "B", "C" ), 
  streams [ 1 ] returning ( "X", "Y", "Z" ) 
  and streams [ 2 ] as ( "0", "1", "2" )
Run Code Online (Sandbox Code Playgroud)

我想要一个返回的流

  ( { "A", "X", "0" }, { "B", "Y", "1" }, { "C", "Z", "2" } )
Run Code Online (Sandbox Code Playgroud)

是否有一些代码已经实现了这一点?我有一个如何去做的想法,这将是对 case的概括,但我想知道是否已经存在可重用的东西。

编辑:对不起,我意识到我需要澄清一下:

  • 我不想创建整个矩阵,我想要一个每次动态返回一行的流(首先是 A/X/0,然后是 B/Y/1 等),而不必占用所有行的内存提前。我对基本流的大小做出合理的假设很好(例如,取最小值,一旦有没有更多元素要返回的流就停止)。

  • 我知道这可以通过首先将基本流转换为迭代器,然后创建一个新的迭代器来实现,其中 next() 从每个下划线迭代器中选择一个元素并返回一个新行。这就是我上面链接的配对示例所做的,我可以自己实现它,在这里我试图了解它是否已经在某个库中完成(我知道 JDK 没有这样的功能)。

java-8 java-stream

5
推荐指数
1
解决办法
3426
查看次数

使用 java 流将两个相同大小(和不同类型)的列表合并到域对象列表中

我有两个相同尺寸的名单ids,并results和我想创建一个域对象的新名单。

List<Id> ids = ...

List<Result> results = redisTemplate.opsForValue().multiGet.get(ids);

List<DomainObject> list = // list of domain objects new DomainObject(id, result);
Run Code Online (Sandbox Code Playgroud)

我用过的解决方案:

List<DomainObject> list = new ArrayList<>(ids.size());
for (int i = 0; i < ids.size(); i++) {
    list.add(new DomainObject(ids.get(i), results.get(i)));
}
Run Code Online (Sandbox Code Playgroud)

有没有更优雅的方法来做到这一点,例如。使用流?

java collections java-stream

5
推荐指数
1
解决办法
1029
查看次数

如何使用java 8 lambda表达式迭代两个流并保持计数

我有两个列表流,一个是字符串(县),另一个是对象(txcArray).我需要遍历两个列表并将一个县的实例与txcArray的实例进行比较,并且它们匹配递增一个计数器,如果它们没有,我会继续前进.我需要使用java 8 lambda表达式这样做,这是我到目前为止所做的.

counties.stream().forEach(a-> {
     txcArray.stream()
             .filter(b->b.getCounty().equals(a))
             .map(Map<String,Integer>)
});
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

3
推荐指数
1
解决办法
1535
查看次数

使用Java 8合并流

在阅读了关于流的内容后,我现在尝试使用它们,并且已经通过简单的示例出现了第一个问题.我想实现一个非常简单的加密算法,它使用替换.有一些文本需要加密:

static List<Integer> text = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
        11, 12, 13, 14, 15, 16, 17, 18, 19, 20);
Run Code Online (Sandbox Code Playgroud)

有一些密码:

private List<Integer> password = Arrays.asList(1, 5, 7, 3);
Run Code Online (Sandbox Code Playgroud)

现在的想法是将密码值添加到文本值.结果应该是

1 + 1,2 + 5,3 + 7,4 + 3,5 + 1,6 + 5 ......

所以我必须从密码创建一个流,它从到达上面列表末尾的开头开始.这部分我已经设法做到了.

现在我不得不将2个流合并为1个流.任何想法,如何实现?

lambda java-8 java-stream

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