标签: java-8

java8 stream不会更改类成员

我有这个代码:

Set<String> namesSet = new HashSet<>();

@Override
public boolean isValid(List<String> input) {
    input.stream().map(item -> namesSet.add(item));
    return namesSet.size() == input.size();
}
Run Code Online (Sandbox Code Playgroud)

input 是一个包含一个项目的列表.

为什么这个项目没有被添加到namesSet之后stream::map呢?

这里更新是我的修复:

Set<String> namesSet;

@Override
public boolean isValid(List<String> input) {
    namesSet = new HashSet<>();
    input.stream().forEach(item -> namesSet.add(item));
    return namesSet.size() == input.size();
}
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

Java Functional - 反转任何列表类型的ANY对象

我试图在Java 8中编写一个lambda函数,它将采用任何对象的任何类型的List.这个简单的函数会反转一个列表,关键是我希望这个函数能够获取任何对象的列表.功能/类如下:

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

public abstract class ReverseListFunction {

    // function which reverses a list
    public static Function<List<Object>, List<Object>> reverseList = (List<Object> l) ->  {
        int midPoint = endIndex/2;
        for (int i = endIndex; i > midPoint; i-- ) {
            Object temp = l.get(i);
            int distanceFromEndIndex = endIndex - i;
            l.set(i, l.get(distanceFromEndIndex));
            l.set(distanceFromEndIndex, temp);
        }
        return l;
    };

}
Run Code Online (Sandbox Code Playgroud)

我已经将它设置为静态,因此我可以在不实例化类的情况下调用它,如下所示:

import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {

        List<Integer> ints = new …
Run Code Online (Sandbox Code Playgroud)

java functional-programming java-8

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

如何使用Java 8转换Map的每个条目集的键和值?

我有一个Map<String, String>我想转换为Map<Type1,Type2>使用Java流的.

这是我尝试过但我认为我的语法错误:

myMap.entrySet()
.stream()
.collect(Collectors.toMap(e -> Type1::new Type1(e.getKey()), e -> Type2::new Type2(e.getValue))));
Run Code Online (Sandbox Code Playgroud)

也试过了

myMap.entrySet()
    .stream()
    .collect(Collectors.toMap(new Type1(Map.Entry::getKey), new Type2(Map.Entry::getValue));
Run Code Online (Sandbox Code Playgroud)

但我只是继续运行编译错误.我该如何改造?

java hashmap java-8 java-stream

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

如何通过值集合流式传输?

如何流式传输Map<String, List<String>>获取:

  1. List<String>所有的String的值s List的第Map它们比5个字符?如何长期计算这些?

  2. Map<String, List<String>>其中密钥保持不变,但List小号仅由String长度大于5号第?

  3. A 在每张地图的密钥中有多于5的Map<String, Long>计数?StringList

我开始做的事情但我被困住了:

long l = map.entrySet().stream()
            .filter(m -> m.getValue().stream().filter(s -> s.length() > 5)
Run Code Online (Sandbox Code Playgroud)

谢谢

java collections java-8 java-stream

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

什么是在Spring中将属性文件值转换为字符串集的有效方法

我试过用

@Value("#{'${white.listed.hotel.ids}'.split(',')}")
private Set<String> fareAlertwhiteListedHotelIds;
Run Code Online (Sandbox Code Playgroud)

但是当white.listed.hotel.ids为空时,还设置了一个带空白值的大小.

white.listed.hotel.ids =

有人请帮我一个版本,其中whiteListedHotelIds可以包含属性文件中指定的值或没有空白案例的项目.

java spring properties-file java-8 spring-boot

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

从一个列表中提取多个字段并将其保存到另一个列表或相同类型的新列表.在java 8中

我有一个用户List<User>"abc" 的列表.

class User {
int id;
String name;
String address;
.....//getters and setters
}
Run Code Online (Sandbox Code Playgroud)

我只需要从中提取名称和地址List<User>并保存到另一个新的列表对象List<User>"xyz".或者一些新的列表,它有两个字符串字段的名称和地址.例如:

class SomeClass {
String name;
String address;
........//getters and setters
}
Run Code Online (Sandbox Code Playgroud)

我知道可以通过迭代原始列表并保存到另一个新列表对象来完成.但我想知道如何Java 8更有效地完成它.通过使用streams(),map()...等使用默认构造函数.

java list java-8 java-stream

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

Java8流式类层次结构

我正在慢慢学习Java 8的新功能,并试图找到一种以流方式处理类层次结构(从子级到父级)的方法。

例如,在类或其父级上找到注释。

在Java 8之前,我会这样完成:

public static <T extends Annotation> T getAnnonationOn(Class<?> type, Class<T> annType) {
    Class<?> t = type;
    T annot = null;
    while (t != null && annot == null) {
        annot = t.getAnnotation(annType);
        t = t.getSuperclass();
    }
    return annot;
}
Run Code Online (Sandbox Code Playgroud)

现在,我希望以一种更加“功能性的编程”方式来做到这一点。我找不到比使用以下递归连接流更好的方法:

import java.lang.annotation.Annotation;
import java.util.stream.Stream;

public static <T extends Annotation> T getAnnonationOn(Class<?> type, Class<T> annType) {
    return ClassIterator.streamSuperclass(type)
        .map(t -> t.getAnnotation(annType))
        .filter(a -> a != null)
        .findFirst()
        .orElse(null);
}

public static class ClassIterator {
    public static Stream<Class<?>> …
Run Code Online (Sandbox Code Playgroud)

reflection java-8 java-stream

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

findFirst()用于Java流,但是对于n个元素?

我想从流中收集前n个元素,而不是遍历整个事物.是否有标准方法可以做到这一点?翼

MyList.stream()
  .filter(x -> predicate(x))
  .findFirstN(100)
Run Code Online (Sandbox Code Playgroud)

会从流中返回最多100个元素的集合吗?我的另一种方法是评估整个流,然后从结果中进行采样,但这并没有利用流固有的惰性评估.

java lazy-evaluation java-8 java-stream

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

如何分析Java 8压缩类空间中的内存泄漏?

一些上下文:我们已将Web应用程序的环境从在Java 7上运行升级到在Java 8和Tomcat 8上运行(64位arch,堆大小约2 GB,PermGen大小= 256 MB,对元空间大小没有约束).过了一会儿,我们开始收到以下错误:

java.lang.OutOfMemoryError:压缩的类空间

这意味着UseCompressedClassPointers所需的空间超出了CompressedClassSpaceSize.那时VisualVM显示了2 GB的元空间大小.

现在使用VisualVM工具,我们可以看到Metaspace大小随着每个请求大约3 MB而不断增加,但是堆似乎没有这样做.堆使用具有锯齿形状,在每个GC之后返回到相同的低点.

我可以告诉应用程序仅在使用Java JAXB操作时泄漏元数据,但我无法用VisualVM证明它.

该应用程序依赖于webservices-rt-1.4作为JAXB实现提供程序.该应用程序使用编组,解组.XSD的类生成是使用maven-jaxb2-plugin-0.13.1完成的.


更新:

在跟踪类加载和卸载之后,我发现WebAppClassLoader多次将相同的JAXB类加载到内存中,但从未清理过.而且,堆中没有实例.我调试了,我看到JDK通过反射调用方法javax.xml.bind.JAXBContext com.sun.xml.bind.v2.ContextFactory.createContext,这是在创建类时.

我虽然这些课程都是由GC清理的.是否负责清理classLoader?


问题:有没有办法分析元空间对象?为什么我在元空间中有泄漏而在堆中没有泄漏?他们不相关吗?这甚至可能吗?

为什么应用程序可以正常使用PermGen而不是Metaspace?

memory-leaks metadata jaxb out-of-memory java-8

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

为什么lambda里面的地图没有运行?

我试图在java 8中学习并发和lambdas.但是我的代码没有在map中输入lambda块.

List<Book> bookList = new ArrayList<Book>();
    isbnList
    .stream()
    .map(isbn -> (CompletableFuture.supplyAsync( () -> {
        try {
            List<String> pageContents = getUrlContents(webLink + isbn);
            return new Book(
                parseBookTitle(pageContents),
                isbn,
                parseRank(pageContents)
            );
        } catch (IOException ex) {
            return null;
        }
    })).thenApply(a -> bookList.add(a))
    );
Run Code Online (Sandbox Code Playgroud)

在调试时,代码退出.map行,我得到空bookList.顺序代码给我正确的结果.

concurrency lambda java.util.concurrent java-8 concurrent.futures

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