我想java.util.Collection根据谓词过滤一个.
收集器的Javadoc显示如何将流的元素收集到新的List中.是否有一个单行程序将结果添加到现有的ArrayList中?
如何将流收集到我指定的子类型列表中?
换句话说,我希望这个测试通过.如何在注释行上将流转换为MyList实例?
import org.junit.*;
import java.util.*;
import static java.util.stream.Collectors.*;
import static junit.framework.Assert.*;
@Test
public void collectUsingDifferentListType() {
List<String> aList = new ArrayList<>();
aList.add("A");
aList.add("B");
List<String> list1 = aList.stream().collect(toList());
MyList<String> list2 = aList.stream().collect(toList(MyList::new)); // this doesn't exist, but I wish it did
assertEquals(aList, list1);
assertEquals(ArrayList.class, list1.getClass());
assertEquals(aList, list2);
assertEquals(MyList.class, list1.getClass());
}
Run Code Online (Sandbox Code Playgroud) 我应该做的是通过stream.generate 创建一个随机数的ArrayList。下面的代码是我尝试将其保存到 ArrayList 中的尝试,但它是“对象”类型。我想我必须先以某种方式将它映射到 int 中,但我不知道如何。代码现在不起作用。
public ArrayList<Integer> createRandomList(ArrayList<Integer> list, int amount) {
ArrayList<Integer> a = Arrays.asList(Stream.generate(new Supplier<Integer>() {
@Override
public Integer get() {
Random rnd = new Random();
return rnd.nextInt(100000);
}
}).limit(amount).mapToInt.toArray());
}
Run Code Online (Sandbox Code Playgroud) 我在加入在"parallelStream()"中创建的列表时遇到问题.情况如下:
List<Pair>包含"int"值的对List<Edge>使用"parallelStream()"List<Edge>我想做的事情(我希望它能够按照这个答案的最后一个要点发挥作用)如下:
List<Edge> edges = pairs.parallelStream()
.map(p -> align(p.first(), p.second()))
.collect(ArrayList::new, List::add, List::addAll);
Run Code Online (Sandbox Code Playgroud)
随着align()做CPU密集型的工作(这就是为什么我需要摆在首位,以"并行"的话),并返回List<Edge>.
使用collect()阻止我编译,给出以下错误:
错误:java:不兼容类型:无法推断类型变量R,E(参数不匹配;无效方法引用不兼容类型:ArrayList <Edge>无法转换为int)
请注意,我确实设法使类似(但"丑陋"的imo)版本工作,这让我更加困惑:
v1:
List<List<Edge>> collect = pairs.parallelStream()
.map(p -> align(p.first(), p.second()))
.collect(Collectors.toList());
collect.forEach(l -> l.forEach(edges::add));
Run Code Online (Sandbox Code Playgroud)
v2:
List<Edge> edges = new ArrayList<>();
pairs.parallelStream()
.map(p -> align(p.first(), p.second()))
.collect(Collectors.toList()).forEach(edges::addAll);
Run Code Online (Sandbox Code Playgroud)
有人可以帮我弄这个吗?我想避免放弃并使用"v2";)
我有以下代码:
Queue<Reward> possibleRewards =
Stream.of(Reward.values())
.flatMap(reward -> IntStream.range(0, reward.getOccurencies()).mapToObj(i -> reward))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我需要收集Stream成a 的元素Queue,而不是a List.但是,没有Collectors.toQueue()方法.如何将元素收集到Queue?
流式传输时List,如何将输出收集到链表?
我尝试过以下方法:
public static void main(String[] args) {
List<String> firstList = new ArrayList<>();
firstList.add("pavan");
firstList.add("kumar");
LinkedList<String> filtered= new LinkedList<>();
filtered = (LinkedList<String>) firstList.stream().filter(t->firstList.contains("p")).collect(Collectors.toList());
System.out.println(filtered);
}
Run Code Online (Sandbox Code Playgroud)
但 这是让java.util.ArrayList无法强制转换为java.util.LinkedList.
我在许多Java 8参考资料和示例中看到了以下代码:
List <Integer> l = Arrays.asList(7, 3, 9, 8, 6, 5, -1, -100);
l.stream().filter(y -> y <l.get(0)).collect(Collectors.toList()).
forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
但是,我可以使用以下方法获得相同的结果:
l.stream().filter(y -> y <l.get(0)).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
那么,使用几乎普遍使用的collect(Collectors.toList())的神圣性是什么?
我试图通过创建一个存储前 3 个值的单独变量来过滤数组列表。但是,在集合中出现错误。我对此很陌生,所以任何帮助都会很棒!
public static ArrayList<exercise> exerciseDetail() {
ArrayList<exercise> elist = new ArrayList<>();
elist.add(new exercise("Bicycle Crunches", R.drawable.ic_launcher_background, "MEDIUM", "20 Reps or 1 Minute", "Beginner", "Bicycle crunches are a great way to target the rectus abdominis and the obliques in one easy exercise"));
elist.add(new exercise("Leg Raises", R.drawable.ic_launcher_background, "MEDIUM", "20 Reps or 1 Minute", "Beginner", "Bicycle crunches are a great way to target the rectus abdominis and the obliques in one easy exercise"));
elist.add(new exercise("Bridges", R.drawable.ic_launcher_background, "MEDIUM", "20 Reps or 1 Minute", …Run Code Online (Sandbox Code Playgroud) 我有返回的API,Map<String,String>需要将其转换为DTO。
SubjectIdAndNameDTO (id, name constructor args)
id
name
Run Code Online (Sandbox Code Playgroud)
当前的实现使用传统的for循环和Map.EnterSet。我如何使用Java8的功能来简单地执行以下代码。
Map<String, String> map = getSubjectIdAndNameMap();
// How can this code can be improved by using Java8 Stream and method references
List<SubjectIdAndNameDTO> subIdNameDTOList = new ArrayList<>();
for (Entry<String, String> keyset : map.entrySet()) {
SubjectIdAndNameDTO subjectIdNameDTO =
new SubjectIdAndNameDTO(keyset.getKey(), keyset.getValue());
subIdNameDTOList.add(subjectIdNameDTO);
}
Run Code Online (Sandbox Code Playgroud) java ×8
java-8 ×8
java-stream ×8
collectors ×3
arraylist ×2
collections ×2
android ×1
filter ×1
lambda ×1
queue ×1
random ×1