使用流API; 一旦相关数据被过滤,我想编辑正在收集的数据.这是迄今为止的代码:
String wordUp = word.substring(0,1).toUpperCase() + word.substring(1);
String wordDown = word.toLowerCase();
ArrayList<String> text = Files.lines(path)
.parallel() // Perform filtering in parallel
.filter(s -> s.contains(wordUp) || s.contains(wordDown) && Arrays.asList(s.split(" ")).contains(word))
.sequential()
.collect(Collectors.toCollection(ArrayList::new));
Run Code Online (Sandbox Code Playgroud)
编辑下面的代码很糟糕,我试图避免它.(它也没有完全奏效.它是在凌晨4点完成的,请原谅.)
for (int i = 0; i < text.size(); i++) {
String set = "";
List temp = Arrays.asList(text.get(i).split(" "));
int wordPos = temp.indexOf(word);
List<String> com1 = (wordPos >= limit) ? temp.subList(wordPos - limit, wordPos) : new ArrayList<String>();
List<String> com2 = (wordPos + limit < text.get(i).length() -1) …Run Code Online (Sandbox Code Playgroud) 我是大学新手Java程序员.我今天发现了一些关于Java语法如何工作的概念.
public class testClass {
ArrayList <String> persons = new ArrayList <String> ();
public void run(){
Stream <String> personstream = persons.stream();
}}
Run Code Online (Sandbox Code Playgroud)
stream()在ArrayList类中找不到该方法,但它可能看起来好像在那里.当我将鼠标移到stream()Eclipse中的-method上时,它表示它是Collections的一部分,但我stream()在其在线文档中找不到任何方法.
stream()如果它不是我从中调用它的类的一部分,为什么调用该方法呢?
我有一个
HashMap<String,Integer> map
Run Code Online (Sandbox Code Playgroud)
我希望按值按降序排序:
HashMap<String,Integer> topSorted = new HashMap<>();
//sort map in descending order
Stream<HashMap.Entry<String,Integer>> st = map.entrySet().stream();
st.sorted(Comparator.comparing((HashMap.Entry<String,Integer> e) -> e.getValue()).reversed())
.forEach(e -> topSorted.put(e.getKey(),e.getValue()));
Run Code Online (Sandbox Code Playgroud)
但topsorted仍然与地图相同,根本没有进行排序
有人可以解释我做错了什么
我编写了一个简单的程序来与流的性能进行比较,以查找整数的最大形式列表。令人惊讶的是,我发现“流方式”的性能是“通常方式”的1/10。难道我做错了什么?是否有条件限制哪种Stream方法无效?有人能对此行为做出一个很好的解释吗?
“流方式”花费了80毫秒“流方式”花费了15毫秒请在下面找到代码
public class Performance {
public static void main(String[] args) {
ArrayList<Integer> a = new ArrayList<Integer>();
Random randomGenerator = new Random();
for (int i=0;i<40000;i++){
a.add(randomGenerator.nextInt(40000));
}
long start_s = System.currentTimeMillis( );
Optional<Integer> m1 = a.stream().max(Integer::compare);
long diff_s = System.currentTimeMillis( ) - start_s;
System.out.println(diff_s);
int e = a.size();
Integer m = Integer.MIN_VALUE;
long start = System.currentTimeMillis( );
for(int i=0; i < e; i++)
if(a.get(i) > m) m = a.get(i);
long diff = System.currentTimeMillis( ) - start;
System.out.println(diff);
}
Run Code Online (Sandbox Code Playgroud)
}
我有一个关于Java 8和列表的问题.是否可以比下面的代码更容易初始化List?
final List<List<ScheduleIntervalContainer>> weekScheduler = new ArrayList<>();
weekScheduler.add(0, new ArrayList<ScheduleIntervalContainer>());
weekScheduler.add(1, new ArrayList<ScheduleIntervalContainer>());
weekScheduler.add(2, new ArrayList<ScheduleIntervalContainer>());
weekScheduler.add(3, new ArrayList<ScheduleIntervalContainer>());
weekScheduler.add(4, new ArrayList<ScheduleIntervalContainer>());
weekScheduler.add(5, new ArrayList<ScheduleIntervalContainer>());
weekScheduler.add(6, new ArrayList<ScheduleIntervalContainer>());
Run Code Online (Sandbox Code Playgroud) 我试图迭代对象的ArrayList并打印出列表中每个对象的'name'属性.但是,即使我在Person类中有名称的getter方法,我也无法访问该对象的属性.这是一些代码:
ArrayList persons = new ArrayList<>();
persons.add(new Person("Name","Age"));
persons.add(new Person("Name1","Age1"));
persons.add(new Person("Name2","Age2"));
persons
.stream()
.forEach(e -> System.out.println(e.getName())); //giving an error
forEach(e -> System.out.println(e)); //no error
Run Code Online (Sandbox Code Playgroud)
它不允许我这样做.我只能在打印命令中使用'e',它打印对象的参考号.
任何帮助表示赞赏:)
我有列表{"100","5","1","300","7"},当我stream().sorted()用于此列表时,它给了我以下结果{"1","100","300","5","7"}.看起来它只按第一个数字排序.怎么了?
ArrayList<String> list = new ArrayList<>(Arrays.asList(
"100","5","1","300","7"
));
list.stream().sorted().forEach(e -> System.out.println(e));
Run Code Online (Sandbox Code Playgroud) 这些测试的时序差别很大,但是经历了相同的实现.我想了解为什么时间不同.
private static final int ITERATIONS = 100;
private static final DataFactory RANDOM_DF = DataFactoryImpl.defaultInstance();
@Test // 6s
public void testGetMaxLength() throws Exception {
for ( int i = 1; i < ITERATIONS; i++ ) {
testGetMaxLength( i );
}
}
private void testGetMaxLength( final int length ) {
for ( int i = 0; i < ITERATIONS; i++ ) {
String word = RANDOM_DF.word().getMaxLength( length );
assertThat( word, not( isEmptyOrNullString() ) );
assertThat( word.length(), allOf( …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种简洁有效的方法来从使用Java 8流的子项列表中获取唯一父项列表.
对于示例,我有两个简单的类:
public class Child{
private Parent parent;
public Child(Parent parent){
this.parent = parent;
}
public Parent getParent(){
return this.parent;
}
}
public class Parent{
private List<Child> children;
public Parent(){
this.children = new ArrayList<Child>();
}
public void addChild(Child child){
this.children.add(child);
}
}
Run Code Online (Sandbox Code Playgroud)
首先,我从某种方法获得Child对象的列表.
孩子可能属于多个父母,可能有父母碰撞.
List<Child> children = getChildren();
Run Code Online (Sandbox Code Playgroud)
然后 :
List<Parent> uniqueParents = children
.stream()
.collect(Collectors.groupingBy(Child::getParent))
.keySet()
.stream()
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
所以它有效,但我想避免双流并收集.
这可能直接在一个流中吗?
我有以下代码来读取文件的行:
String fileName = "dataset/ANC-all-count.txt";
Integer i=0;
//read file into stream, try-with-resources
try (Stream<String> stream = Files.lines(Paths.get(fileName), StandardCharsets.ISO_8859_1)) {
stream.forEach(System.out::println);
i++;
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("count is : "+i);
Run Code Online (Sandbox Code Playgroud)
但问题是我需要放入i++以下行:
stream.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
所以我想要这样的东西:
stream.forEach(System.out::println; i++);
Run Code Online (Sandbox Code Playgroud)
但它不能以这种方式工作,所以任何人都可以帮助我如何使它工作?
java ×10
java-stream ×10
java-8 ×8
collections ×2
performance ×2
collectors ×1
sorting ×1
syntax ×1