在带有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
我有两个名为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 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 没有这样的功能)。
我有两个相同尺寸的名单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)
有没有更优雅的方法来做到这一点,例如。使用流?
我有两个列表流,一个是字符串(县),另一个是对象(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) 在阅读了关于流的内容后,我现在尝试使用它们,并且已经通过简单的示例出现了第一个问题.我想实现一个非常简单的加密算法,它使用替换.有一些文本需要加密:
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个流.任何想法,如何实现?