我有这个代码:
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 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) 我有一个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)
但我只是继续运行编译错误.我该如何改造?
如何流式传输Map<String, List<String>>获取:
甲List<String>所有的String的值s List的第Map它们比5个字符?如何长期计算这些?
甲Map<String, List<String>>其中密钥保持不变,但List小号仅由String长度大于5号第?
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)
谢谢
我试过用
@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可以包含属性文件中指定的值或没有空白案例的项目.
我有一个用户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 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) 我想从流中收集前n个元素,而不是遍历整个事物.是否有标准方法可以做到这一点?翼
MyList.stream()
.filter(x -> predicate(x))
.findFirstN(100)
Run Code Online (Sandbox Code Playgroud)
会从流中返回最多100个元素的集合吗?我的另一种方法是评估整个流,然后从结果中进行采样,但这并没有利用流固有的惰性评估.
一些上下文:我们已将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?
我试图在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
java-8 ×10
java ×7
java-stream ×6
collections ×1
concurrency ×1
hashmap ×1
jaxb ×1
lambda ×1
list ×1
memory-leaks ×1
metadata ×1
reflection ×1
spring ×1
spring-boot ×1