标签: java-stream

如何保持流中元素的顺序

我想使用下面的spliterator()方法保留数组元素的顺序.

但是,当我运行这个程序时,它正在生成4 2 1 3输出.

   public class Test1 {
    public static void main(String[] args) {
        m1().anyMatch(e -> {
            System.out.println(e);
            return false;
        });
    }

    private static LongStream m1() {
    return StreamSupport.longStream(Arrays.spliterator(new long[] { 1, 2, 3, 4 }), true);
    }
}
Run Code Online (Sandbox Code Playgroud)

请检查并告知我这是否可能.

java java-8 java-stream

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

Lambda将List转换为共享值的Map到唯一值的列表

我有一个Foo包含两个重要属性的列表,Bar bar和Baz baz.实例可以共享Bar值但具有唯一的Bazs.

我想将此List转换为Map,Baz以便共享a的所有实例的唯一值Bar放在映射到该共享的Set中Bar.

Map<Bar, Set<Baz>> m = new HashMap<>();
for (Foo foo : fooRepository.findAll()) {
    if (m.containsKey(foo.bar)) {
        m.get(foo.bar).add(foo.baz);
    } else {
        Set<Baz> set = new HashSet<>();
        set.add(foo.baz);
        m.put(foo.bar, set);
    }
}
Run Code Online (Sandbox Code Playgroud)

我自己的功能印章尚未证明完成任务.我试图将两者reduce和collectList一起尝试但在尝试将不同的参数实现为lambdas时因类型问题而被绊倒.

尝试使用Collect

m = fooRepository.findAll().stream().collect(new HashMap<Bar, Set<Baz>>(), (m, foo)->m.merge(Foo::getBaz, s->s.add(foo.getBar()));
Run Code Online (Sandbox Code Playgroud)

不完整,编译器无法确定m或foo和Foo :: getBaz的类型.

Reduce不起作用,因为它不允许累加器与元素具有不同的值.

java lambda java-stream

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

java 8并行流,blockingcode可能吗?

我的情况很简单.

我有一个列表,我想异步地对每个项目执行逻辑.

当所有线程都完成后,我想调用一个紧密的连接.

像这样:

bucketsList.parallelStream().forEach(t -> {
//some logic
});
 try {
 RestApi.getInstance().closeClientConnection();
 } catch (IOException e) {
     e.printStackTrace();
 }
Run Code Online (Sandbox Code Playgroud)

有没有办法让closeConnection部分等待并行Stream完成遍历所有对象?

编辑:我不能使用,CountDownLatch因为我不知道我将在bucketsList中有多少项目

java asynchronous java-stream

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

Java 8将List的每个字段值映射到另一个类似的List

我有2个对象列表:

List<User>
List<UserResource>
Run Code Online (Sandbox Code Playgroud)

对于User类:

public class User {

    private int id;

    private String name;

    private String address; 

    **SETTERS & GETTERS**
}
Run Code Online (Sandbox Code Playgroud)

对于UserResource类:

public class UserResource {

    private String name;

    private String address; 

    **SETTERS & GETTERS**
}
Run Code Online (Sandbox Code Playgroud)

我List<User>有数据,我想映射值中name和address到UserResource的name和address,用java 8个流和lambda,但我不知道该怎么做.

在线搜索相当一段时间,但无法找到类似的问题.就像是:

List<User> users = **data inserted**
List<UserResource> resources = users.forEach(u ->{
    u.setName(users.getName());
    u.setAddress(users.getAddress());
});
Run Code Online (Sandbox Code Playgroud)

我试过像下面这样的东西,但我不使用构造函数,不确定如何解决它.

List<UserResource> userResources = users.stream().map(u -> new UserResource(u.getName(), u.getAddress())).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

lambda java-8 java-stream

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

为什么我们必须将Collectors.toList()返回的List转换为List <Integer>,即使Stream的元素已经映射到Integer?

我正在将原始映射Stream到a Stream<Integer>,然后将元素收集到a List<Integer>.

为什么我必须将结果投射collect(Collectors.toList())到List<Integer>我的映射器.map(str -> ((String)str).length())- 已映射到Integer?

我的代码:

List list = Arrays.asList("test", "test2");
List<Integer> lengths = (List<Integer>) list.stream()
                                            .map(str -> ((String)str).length())
                                            .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

如果我不使用raw List,则无需强制转换:

List<String> list = Arrays.asList("test", "test2");
List<Integer> lengths = list.stream()
                            .map(str -> str.length())
                            .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

Java 8 Stream每个索引运行1个函数,而每n次运行另一个函数

什么是迭代Java 8 Stream的最佳方式,这样我可以为每个元素(forEach)执行一个函数,而为每10个元素执行另一个函数.使用foreach的每个元素都显示在下面.我可以使用什么功能来拦截eveyr nth元素并执行第二个函数调用?

示例代码如下: -

Stream<String> strings = Files.lines(path); //some stream

stream.forEach(s -> System::println)// every element but how can i perform 
Run Code Online (Sandbox Code Playgroud)

functional-programming java-8 java-stream

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

如何在Java 8流过滤器中基于子文档过滤Mongo文档

我试图过滤子文档.

样本记录:

[Document{{_id=597608aba213742554f537a6, upp_id=, content_id=597608aba213742554f537a3, idmapping=Document{{ptype=PDF, clientid=12345, normalizedclientid=12345, systeminstanceid=, sourceschemaname=, platforminternalid=0987654321}}, batchid=null, locale=en_US}}]
Run Code Online (Sandbox Code Playgroud)

我需要使用idmapping.ptype = PDF进行过滤

MongoCursor<Document> cursor = mailboxitemCollection.find(whereClause).iterator();
List<Document> documentList = new ArrayList<Document>();

while (cursor.hasNext()) {
  Document object = cursor.next();
  documentList.add(object);
}

 List<Document> outList = documentList.stream()
        .filter(p -> p.getInteger(CommonConstants.VISIBILITY) == 1
            && (!StringUtils.isEmpty(req.ptype())? (p.getString("idmapping.ptype").equalsIgnoreCase(req.ptype())) : true)
            ).parallel().sequential().collect(Collectors.toCollection(ArrayList::new));

System.out.println(outList);
System.out.println(outList.size());
Run Code Online (Sandbox Code Playgroud)

我得到Null Point异常,无法从List documentList中读取sub/embed文档.

先感谢您!Bharathi

java stream mongodb java-8 java-stream

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

文件名验证

我每分钟在一个线程中验证目录中的许多文件.目前我正在使用下面的功能,工作正常.我的问题是我是否可以重写此方法以更快地运行(java8?),并希望缩短.

public boolean validateFile(String fileName) {
    fileName = fileName.substring(0, fileName.lastIndexOf('.'));
    String[] values = fileName.split("_");
    if (values.length == 4) {
        if(!values[1].matches("0*")) {
            if(!fileName.contains(" ")) {
                if(values[3].equals("PASS") || values[3].equals("FAIL")) {
                    return true;
                }
            }
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

验证规则:

  1. 文件名不能包含任何空格字符.
  2. 文件名拆分器始终为_字符.
  3. 值[1]不能只包含零(0).它必须有12位数字.
  4. 值[3]必须包含"PASS"或"FAIL".
  5. 数组值[]长度必须始终为4.

您可以使用http://ideone.com/dh8j9M上的文件名示例运行和分叉此代码

java string java-8 java-stream

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

将增强的循环转换为Java 8流,过滤器-forEach

我正在尝试学习Java8。是否可以将下面的方法转换为Java 8 Streams filter和forEach。如果是这样,怎么办?

protected void isValidId(CarModel model, List<String> errors) throws DataAccessException {

    CarStyle[] styles = model.getStyles();

    for(CarStyle style : styles){
        if(!style.isModels()){
            if(style.getStyleId() > 99){
          errors.add(INVALID_ID + ", Id:" + style.getStyleId());

            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我阅读了一些有关Java 8的教程,但不确定如何实现。谢谢。

编辑:我向该方法添加了一个列表。

java java-8 java-stream

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

检查Java Map <T中的空条目,?延伸E>

我有一个Map<String, ? extends Collection<SomeClass>>.我想确保没有条目集合的大小为0.所以我试过myMap.values().stream().map(Collection::size).allMatch(size -> size > 0).但是,事实证明,myMap包含空条目.

我想检查我的地图是否包含空条目:resourceMap.values().stream().noneMatch(null)但我得到了一个例外java.util.Objects.requireNonNull.

我决定以一种相对老式的方式来做这个for-in循环for (Map.Entry<String, ? extends Collection> entry : myMap)但是,我收到一个编译错误,告诉我foreach不适用于我的Map.

检查地图中的所有条目是否为空且大小> 0的优雅方法是什么?

java dictionary java-stream

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