如果我在顺序流上调用collect(例如,从调用Collection.stream()),那么它将使用我传递的汇编器参数来收集吗?我猜不是,但我在文档中看不到任何内容.如果我是正确的,那么不得不提供我知道不会被使用的东西(如果我知道它是顺序流)似乎是不幸的.
此代码在Java 8中编译,但无法在Java 7中编译:
class Map<K,V> {
static <K,V> Map<K,V> empty() {return null;}
Map<K,V> put(K k, V v) {return null;}
V get(K k) {return null;}
}
class A {
static void f(Map<Integer,String> m){}
public static void main(String[] args) {
f(Map.empty());
}
}
Run Code Online (Sandbox Code Playgroud)
它不会推断出Map返回的具体类型Map.empty():
$ javac7 A.java
A.java:10: error: method f in class A cannot be applied to given types;
f(Map.empty());
^
required: Map<Integer,String>
found: Map<Object,Object>
reason: actual argument Map<Object,Object> cannot be converted to Map<Integer,String> by method invocation …Run Code Online (Sandbox Code Playgroud) 我希望能够将转换List为HashMap其中关键是elementName和值是随机的东西(在这种情况下,它的元素名称)的列表.所以总之我想要(A->List(A), B->List(B), C-> List(C)).我尝试使用toMap()并传递它keyMapper,ValueMapper但我收到编译错误.如果有人可以帮助我,我真的很感激.
谢谢!
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> list = Arrays.asList("A","B","C","D");
Map<String, List<String>> map = list.stream().map((element)->{
Map<String, List<String>> map = new HashMap<>();
map.put(element, Arrays.asList(element));
return map;
}).collect(??);
}
Function<Map<String, String>, String> key = (map) -> {
return map.keySet().stream().findFirst().get();
};
Function<Map<String, String>, String> value = (map) -> {
return map.values().stream().findFirst().get();
};
Run Code Online (Sandbox Code Playgroud)
=== 这对我有用
谢谢你所有的帮助!@izstas"他们应该对元素进行操作"帮了很多:).实际上这正是我想要的确切
public static void …Run Code Online (Sandbox Code Playgroud) 在Java 8中if/throw else/return是否有更短的语法?java.util.Optional提供了在一个语句中完成此操作的方法,但它需要Optional为每个具有非空引用的调用创建一个实例.
public static MyEnum fromString(String value) {
MyEnum result = enumMap.get(value);
if (result == null)
throw new IllegalArgumentException("Unsupported value: " + value);
return result;
}
Run Code Online (Sandbox Code Playgroud)
public static MyEnum fromString(String value) {
return Optional.ofNullable(enumMap.get(value)).orElseThrow(
() -> new IllegalArgumentException("Unsupported value: " + value));
}
Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用Java 8,我想知道是否有办法编写一个返回的方法Function?
现在我的方法如下:
Function<Integer, String> getMyFunction() {
return new Function<Integer, String>() {
@Override public String apply(Integer integer) {
return "Hello, world!"
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在Java 8中更简洁地编写?我希望这会起作用,但它不会:
Function<Integer, String> getMyFunction() {
return (it) -> { return "Hello, world: " + it }
}
Run Code Online (Sandbox Code Playgroud) 那可以做些什么呢?
我已经运行了一些测试,似乎Scala Hashmap比Java HashMap慢得多.请证明我错了!
对我来说,Hashmap的重点是快速访问给定键的值.因此,当速度很重要时,我发现自己会使用Java HashMap,这有点让人伤心.我没有足够的经验肯定地说,但似乎你混合Java和Scala越多,你可能面临的问题就越多.
test("that scala hashmap is slower than java") {
val javaMap = new util.HashMap[Int,Int](){
for (i <- 1 to 20)
put(i,i+1)
}
import collection.JavaConverters._
val scalaMap = javaMap.asScala.toMap
// check is a scala hashmap
assert(scalaMap.getClass.getSuperclass === classOf[scala.collection.immutable.HashMap[Int,Int]])
def slow = {
val start = System.nanoTime()
for (i <- 1 to 1000) {
for (i <- 1 to 20) {
scalaMap(i)
}
}
System.nanoTime() - start
}
def fast = {
val start = System.nanoTime()
for …Run Code Online (Sandbox Code Playgroud) 我有一个Parent具有20个属性的Java类(attrib1, attrib2 .. attrib20)及其相应的getter和setter.我还有两个Parent对象列表:list1和list2.
现在我想合并两个列表并避免基于attrib1和的重复对象attrib2.
使用Java 8:
List<Parent> result = Stream.concat(list1.stream(), list2.stream())
.distinct()
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但是我必须在哪个地方指定属性?我应该覆盖hashCode和equals方法吗?
我使用Spring连接到数据库.我有一个扩展接口CrudRepository<People, Long>这是我想在db上执行的查询:SELECT DISTINCT name FROM people WHERE name NOT IN UserInputSet.我更愿意在没有任何sql注释的情况下完成它,所以如果没有那么好就可以NOT.
有办法吗?我查看了春季文档,但我找不到任何内容(http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation)
这就是我累了,但它不起作用.
@Query("SELECT DISTINCT name FROM people WHERE name NOT IN (?1)")
List<String> findNonReferencedNames(List<String> names);
Run Code Online (Sandbox Code Playgroud)
这是我得到的例外:
Error creating bean with name 'peopleRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List de.test.tasks.persistence.PeopleRepository.findNonReferencedNames(java.util.List)!
Run Code Online (Sandbox Code Playgroud)
和
Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: people is not mapped [SELECT name FROM people WHERE name NOT IN (?1)]
Run Code Online (Sandbox Code Playgroud) 我有以下代码:
public class LambdaTest1 {
public static void method1(Predicate<Integer> predicate){
System.out.println("Inside Predicate");
}
public static void method1(Function<Integer,String> function){
System.out.println("Inside Function");
}
public static void main(String[] args) {
method1((i) -> "Test");
}
}
Run Code Online (Sandbox Code Playgroud)
这给我一个错误信息
"方法method1(谓词)对于LambdaTest1类型是不明确的".
我可以看到,对于Function和Consumer功能接口,输入参数是Integer.但对于Function,返回类型是String.
因为我的lambda调用具有返回值"Text" - 这应该调用我的Function函数接口而不是抛出此错误.
任何人都可以解释这种行为背后的原因吗?
另一个例子:
public class LambdaTest1 {
public static void method1(Consumer<Integer> consumer){
System.out.println("Inside Consumer");
}
public static void method1(Predicate<Integer> predicate){
System.out.println("Inside Predicate");
}
public static void main(String[] args) {
List<Integer> lst …Run Code Online (Sandbox Code Playgroud) 我需要获得两个ZonedDateTime实例来表示当前周的开始和结束.
ZonedDateTime currentDateTime = ZonedDateTime.now();
ZonedDateTime startOfThisWeek = currentDateTime.with(DayOfWeek.MONDAY).truncatedTo(ChronoUnit.DAYS).plusMinutes(1);
ZonedDateTime endOfThisWeek = startOfThisWeek.plusDays(6);
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd kk:mm");
String startweek = startOfThisWeek.format(df);
String endweek = endOfThisWeek.format(df);
System.out.println(startweek);
System.out.println(endweek);
Run Code Online (Sandbox Code Playgroud)
输出:
2018-06-18 24:01
2018-06-24 24:01
Run Code Online (Sandbox Code Playgroud)
这个字符串代表什么?是在2018-06-18上午午夜后1分钟?如果是这样,为什么24:01是有效时间?我认为在24小时制表示中它应该是00:01.
编辑:有没有办法格式化这个显示00:01而不将字符串转换为新的字符串?
java-8 ×10
java ×9
hashmap ×2
java-stream ×2
lambda ×2
collectors ×1
datetime ×1
generics ×1
hibernate ×1
java-7 ×1
jpa ×1
list ×1
scala ×1
scala-2.11 ×1
spring ×1