我试图在我的项目中使用joptsimple包但我得到以下错误:
Error:(4, 20) java: package jdk.internal.joptsimple is not visible
(package jdk.internal.joptsimple is declared in module jdk.internal.opt, which does not export it to the unnamed module)
Run Code Online (Sandbox Code Playgroud)
任何想法我应该怎么做呢?
使用java.lang.invoke.MethodHandle调用私有方法给出了私有成员访问的答案,而使用LambdaMetafactory的Java访问bean方法给出了基于lambda的成员访问的答案.但是,通过组合这两者,我仍然找不到通过lambda访问私有成员的方法.错误:
Caused by: java.lang.IllegalAccessException: member is private: XXX from ZZZ
at java.lang.invoke.MethodHandles$Lookup.revealDirect(MethodHandles.java:1353)
at java.lang.invoke.AbstractValidatingLambdaMetafactory.<init>(AbstractValidatingLambdaMetafactory.java:131)
at java.lang.invoke.InnerClassLambdaMetafactory.<init>(InnerClassLambdaMetafactory.java:155)
at java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:299)
Run Code Online (Sandbox Code Playgroud)
指向revealDirect,它是metafactory调用站点构建器的一部分.如何自定义构建器以控制其访问检查?
更新:每个Holger 工作解决方案选项#3的示例
有人可以帮助我理解为什么这段代码的行为如评论中所述
// 1) compiles
List<Integer> l = Stream.of(1, 2, 3).collect(ArrayList::new, ArrayList::add, ArrayList<Integer>::addAll);
/*
* 2) does not compile
*
* Exception in thread "main" java.lang.Error: Unresolved compilation problems:
* Type mismatch: cannot convert from Object to <unknown>
* The type ArrayList does not define add(Object, Integer) that is applicable here
* The type ArrayList does not define addAll(Object, Object) that is applicable here
*/
Stream.of(1, 2, 3).collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
// 3) compiles
Stream.of(1, 2, 3).collect(ArrayList<Integer>::new, ArrayList::add, ArrayList::addAll);
/*
* 4) …Run Code Online (Sandbox Code Playgroud) 我使用parallelStream来获取数组中最长的字符串,代码跟随,每次运行时,我得到不同的结果.AtomicReference假设即使在parallelStream中使用时也是线程安全的?但为什么会这样呢?
public static void main(String[] args) {
AtomicReference<String> longest = new AtomicReference<>();
LongAccumulator accumulator = new LongAccumulator(Math::max, 0);
List<String> words = Arrays.asList("him", "he", "thanks", "strings", "congratulations", "platform");
words.parallelStream().forEach(
next -> longest.updateAndGet(
current -> {
String result = next.length() > accumulator.intValue() ? next : current;
accumulator.accumulate(next.length());
return result;
}
)
);
System.out.println(longest.get());
}
Run Code Online (Sandbox Code Playgroud)
有一段时间,我打印出"祝贺",有时我打印出"平台".
我想分割下面的字符串并将其存储到HashMap中.
String responseString = "name~peter-add~mumbai-md~v-refNo~";
Run Code Online (Sandbox Code Playgroud)
首先,我使用分隔符连字符( - )拆分字符串并将其存储到ArrayList中,如下所示:
public static List<String> getTokenizeString(String delimitedString, char separator) {
final Splitter splitter = Splitter.on(separator).trimResults();
final Iterable<String> tokens = splitter.split(delimitedString);
final List<String> tokenList = new ArrayList<String>();
for(String token: tokens){
tokenList.add(token);
}
return tokenList;
}
List<String> list = MyClass.getTokenizeString(responseString, "-");
Run Code Online (Sandbox Code Playgroud)
然后使用下面的代码将其转换为使用流的HashMap.
HashMap<String, String> = list.stream()
.collect(Collectors.toMap(k ->k.split("~")[0], v -> v.split("~")[1]));
Run Code Online (Sandbox Code Playgroud)
流收集器不起作用,因为没有refNo的值.
如果我在ArrayList中有偶数个元素,它可以正常工作.
有办法处理这个吗?还建议我如何使用流来执行这两个任务(我不想使用getTokenizeString()方法)使用流java 8.
我有一个像Map这样的结构<String,List<Map<String,Object>>.我想将一个函数应用于地图,如下所示.该方法接受一个键并使用<String,Object>列表的Map .每个键<String,Object>在列表中都有几个Map .如何将处理方法应用于Map的每个值的地图键<String,Object>?我能够使用forEach循环(见下文),但我感觉这不是以功能方式解决问题的最佳方法.
TypeProcessor p=new TypeProcessor.instance();
//Apply this function to the key and each map from the list
// The collect the Result returned in a list.
Result process(String key, Map<String,Object> dataPoints);
Run Code Online (Sandbox Code Playgroud)
List<Result> list = new ArrayList<>();
map.forEach(key,value) -> {
value.forEach(innerVal -> {
Result r=p.process(key,innerVal);
list.add(r):
});
});
Run Code Online (Sandbox Code Playgroud) 我需要你的帮助按照查询.鉴于以下列表:
["2XL", "3XL", "4XL", "5XL", "6XL", "L", "M", "S", "XL"]
Run Code Online (Sandbox Code Playgroud)
如何对其进行排序以使其按此顺序排列?
["S","M","L","XL","2XL","3XL","4XL","5XL","6XL"]
请注意,并不总是存在每个尺寸.
例如,
List<Product> productsList = new ArrayList<Product>();
productsList.add(new Product(1,"HP Laptop",25000f));
productsList.add(new Product(2,"Dell Laptop",30000f));
productsList.add(new Product(3,"Lenevo Laptop",28000f));
productsList.add(new Product(4,"Sony Laptop",28000f));
productsList.add(new Product(5,"Apple Laptop",90000f));
Float totalPrice = productsList.stream()
.map(product->product.price)
.reduce(0.0f,(sum, price)->sum+price);
System.out.println(totalPrice);
Run Code Online (Sandbox Code Playgroud)
这是哪个功能界面,(sum, price)->sum+price是指?
我想知道是否有办法添加针对方法 takeWhile() 的条件测试的流的最后一个元素。我相信我想实现类似于 RxJava 的 takeUntil() 方法的东西。
我猜没有直接的方法可以做到这一点(如果我错了,请纠正我),但我想知道是否有适当的解决方法来实现这一点,我现在知道了。
我在 Stackoverflow 中进行了搜索,但几乎没有成功。如果您认为有可以解决我的问题的线程,我当然希望看到它。
如果您查看以下代码的 peek(),您将看到数字 5 已根据 takeWhile() 条件进行检查,但它从未到达 forEach() 中:
IntStream.of(1, 3, 2, 5, 4, 6)
.peek(foo -> System.out.println("Peek: " + foo))
.takeWhile(n -> n < 5)
.forEach(bar -> System.out.println("forEach: " + bar));
Run Code Online (Sandbox Code Playgroud)
预期结果是根据 takeWhile 的条件检查的最后一个元素到达 forEach 的 System.out::println。在这种情况下,它是 5。
谢谢大家!
用户详细信息模型:
private String userName;
private int userSalary;
Run Code Online (Sandbox Code Playgroud)
我有一个用户信息的 ArrayList
List<UserDetail> userDetails = new ArrayList<>();
UserDetail user1 = new UserDetail("Robert", 100);
UserDetail user2 = new UserDetail("John", 100);
UserDetail user3 = new UserDetail("Robert", 55);
userdetails.add(user1);
userdetails.add(user2);
userdetails.add(user3);
Run Code Online (Sandbox Code Playgroud)
我正在尝试遍历数组并找出是否有任何重复的条目基于userName,从上面的列表中我有两条用户名相同的记录"Robert",在这种情况下,我想添加userSalary并从列表。
预期的新 ArrayList:
userName userSalary
Robert 155
John 100
Run Code Online (Sandbox Code Playgroud)
这可能吗 ??