在C#中,Enumerable.Select与lambdas的Java对应关系是什么?
说我在C#中有一个对象: public class Person { public string Name{get;set;} public int Age{get;set;} } 要在C#中选择此列表的名称: : List names = person.Select(x=>x.Name).ToList(); 我将如何在Java 8中做同样的事情? 解决方案 如果您有一个像List persons;的人列表,则可以说 List names =persons.stream().map(x->x.getName()).collect(Collectors.toList()); 或,或者, List names =persons.stream().map(Person::getName).collect(Collectors.toList()); ,但仅在您
42 2024-04-17
编程技术问答社区
在JAVA的流媒体API中,什么是相当于C#的选择子句?
我想过滤人类班级列表,最后映射到Java中的某些匿名类.我可以在C#中很容易做同样的事情. 人类班级 class Person { public int Id { get; set; } public string Name { get; set; } public string Address { get; set; } } 代码以欲望格式映射结果. List lst = new List(); lst.Add(new Person() { Name = "Pava", Address = "India", Id = 1 }); lst.Add(new Person() { Name = "tiwari", Address = "USA", Id = 2 }); var result = lst.Select(p => new { Address = p.Address, Name = p.Na
12 2024-04-15
编程技术问答社区
解析和翻译Java 8 lambda表达式
在c#中,您可以将lambda表达式包含在表达树对象中,然后可能 parse it .我想知道在Java中是否也可以吗? 我正在寻找的是这样的事情: BooksRepository.getAll() .where(b -> b.getIban() == "SomeIban") .and(b -> b.getAuthor() == "SomeAuthor"); //etc. ,然后BooksRepository应该以某种方式将该查询转换为以下基于指定为lambdas的谓词: GET http://mylibrary.com/books?Iban=SomeIban&Author=SomeAuthor ,然后将结果退还给客户端.知道这是否在Java中甚至可以? 中 解决方案 是的,这是可能的.我制作了一个完全做到这一点的库: jaque 其他解决方案 我是 jinq 的作者.可以在运行时可以读取的lambdas自动转换为表达树,这是仅C#功能.该功能实际
16 2024-04-14
编程技术问答社区
Java注解的默认值是否被编译成字节码?
我尝试对Java字节码实现多个静态分析.他们尝试计算某种方法是否具有特定属性,例如是一种工厂方法.由于这些分析很难测试,因此我决定编写一些Java代码,并直接用正确的属性注释方法.运行分析后,很容易自动检查计算和注释的属性是否相同. myannotation: @Retention(RUNTIME) @Target(METHOD) public @interface FactoryMethodProperty { FactoryMethodKeys value() default FactoryMethodKeys.NonFactoryMethod; } 示例测试代码: public class PublicFactoryMethod { private PublicFactoryMethod(){ // I'm private } @FactoryMethodProperty public static
16 2024-04-05
编程技术问答社区
你能在运行时检查Java 8 lambda的字节码吗?
如果您有一个匿名类,例如 Predicate isEmpty = new Predicate() { public boolean test(String t) { return t.isEmpty(); } }; 传递的引用isEmpty的库可以检查字节代码以查看它的作用并可能对其进行操作.有没有办法为lambdas做到这一点? Predicate isEmpty = String::isEmpty; 例如,说具有此代码和字节代码 public class Main { public static void test(Predicate tester) { System.out.println("tester.getClass()= " + tester.getClass()); System.out.println("tes
32 2024-04-05
编程技术问答社区
ASM 5.0.3 使用Java 1.8的maxStack不正确,有Java.lang.VerifyError。操作符堆栈溢出
使用ASM 5.0.3(带Java 1.8.0_65&Tomcat 8.0.30),访问JSP(date.jsp)方法之一-_jsp(_jspservice),低于异常 javax.servlet.ServletException: java.lang.VerifyError: Operand stack overflow Exception Details: Location: org/apache/jsp/jsp/dates/date_jsp._jspService(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V @0: aload_1 Reason: Exceeded max stack size. Current Frame: bci: @0 flags: { } locals: { 'org/apache/
16 2024-04-05
编程技术问答社区
通过Java从.class文件中获取ByteCode(依赖性)信息
我想分析.class文件,并获取有关哪个类别使用哪个类的信息. jdeps是一种命令行工具,可让您在控制台中显示一些信息,但是我想避免调用外部工具并刮擦命令行输出. 解决方案 所有依赖关系都记录在类文件的中心位置,即常数池.因此,要有效地处理所有依赖关系,您需要一个库允许处理恒定池而无需查看集体文件的其余部分(这排除了ASM,否则这是一个非常好的字节码处理库). 因此,例如 javassist ,您可以按照 来完成这项工作 private static Set getDependencies(InputStream is) throws IOException { ClassFile cf = new ClassFile(new DataInputStream(is)); ConstPool constPool = cf.getConstPool(); HashSet set = new HashSet(
12 2024-04-05
编程技术问答社区
在接口中的静态方法上调用estatic
拆卸一些Java 8代码,我发现在接口中使用静态方法的一些invokestatic使用const池中的Interfacemethodref使用;这就是javap -s -c -v p向我展示: 15: invokestatic #66 // InterfaceMethod java/util/function/Function.identity:()Ljava/util/function/Function; 根据 JVM 8规格这是不可能的,当我在classfile中使用此指令与java 7(major version=51)使用此指令时,它已经对此说明进行了验证. 但是,当我将主要版本更改为52时,它开始像魅力一样工作.请注意,我正在Oracle JDK 1.8.0_60上运行.我想知道为什么需要此更改(调用方法是静态链接的,不是吗?)以及是否在任何地方进行了记录. 解决方案 好吧,在interface中的Java 8,static方法之前,不允许使
14 2024-04-05
编程技术问答社区
在Java 8中转换lambdas
Java 8似乎生成类以表示Lambda表达式.例如,代码: Runnable r = app::doStuff; 大致表示: // $FF: synthetic class final class App$$Lambda$1 implements Runnable { private final App arg$1; private App$$Lambda$1(App var1) { this.arg$1 = var1; } private static Runnable get$Lambda(App var0) { return new App$$Lambda$1(var0); } public void run() { this.arg$1.doStuff(); } } 据我了解,代码是在运行时生成的.现在,假设一个人想将代码注入上述类的
14 2024-04-05
编程技术问答社区
为什么lambda翻译需要生成一个静态方法?
lambda翻译是一个两个步骤的过程,一个:将lambda删除为同一类静态方法. public class Main { public static void main(String[] args) { Runnable r = () -> System.out.println("Hello"); System.out.println(Arrays.asList(Main.class.getDeclaredMethods())); } } [私人静态void main.lambda $ main $ 0(),公共静态无效 main.main(java.lang.string [])] 两个:生成实现功能接口的类. System.out.println("A class has been generated: " + r.getClass()); System.out.println("That implements a
10 2024-04-05
编程技术问答社区
是否可以在运行时检索lambda表达式
我昨晚正在和Java8 Lambda一起玩,我想知道是否可以在运行时检索Lambda的表情.简而言之,据我所知,Lambda表达在运行时转换为(静态)方法,然后使用Invokedy namilics调用. 让我们以这样的例子: people.filter(person -> person.getAge() >= minAge); 其中filter将是一种自定义方法,以Predicate为参数. 在此filter方法中,我如何以与lambda表达式相似(或相同)的形式检索参数(person -> person.getAge() >= minAge)? ? 我尝试使用ASM5_BETA读取参数类的生成字节码,但是我比使用classVisitor和MethodVisitor无法走得更远,以达到与lambda表达式相关的方法. public List filter(Filter expression) { try {
14 2024-04-05
编程技术问答社区
为什么Java 8的lambdas要用invokedynamic来调用?
invokedynamic指令用于帮助VM在运行时确定方法参考,而不是在编译时硬线. 这对动态语言很有用,在该语言中,确切的方法和参数类型要等到运行时才知道.但Java Lambdas并非如此.它们被翻译成具有定义明确的参数的静态方法.并且可以使用invokestatic. 调用此方法 那么,lambdas对invokedynamic的需求是什么,尤其是在表演命中时? 解决方案 lambdas不使用invokedynamic调用,它们的对象表示是使用invokedynamic创建的,实际调用是常规的invokevirtual或invokeinterface. . 例如: // creates an instance of (a subclass of) Consumer // with invokedynamic to java.lang.invoke.LambdaMetafactory something(x -> System.out.println(
14 2024-04-05
编程技术问答社区
在Java Lambda'中,为什么要在捕获的变量上调用getClass()?
如果您查看 的字节代码 Consumer println = System.out::println; 字节代码生成的Java 8 Update 121 IS GETSTATIC java/lang/System.out : Ljava/io/PrintStream; DUP INVOKEVIRTUAL java/lang/Object.getClass ()Ljava/lang/Class; POP INVOKEDYNAMIC accept(Ljava/io/PrintStream;)Ljava/util/function/Consumer; [ // handle kind 0x6 : INVOKESTATIC java/lang/invoke/LambdaMetafactory.metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invo
14 2024-04-05
编程技术问答社区
在Java 8中优化替换某些文件的字节数
我在Java中具有这种方法,我想改进它. 该方法用于用新字节替换某些文件的某些零件(在开始,中间或末尾)(所选零件可以用较少或更多的字节)替换. 选择是按位置(start)和quantity. 完成的. 我不能使用外部库(guava或其他库). 在这里我的旧代码: public static void replaceBytesFile(RandomAccessFile rafTarget, byte[] replacers, int start, int quantity) { //replaces exact amount of bytes of a file starting at a specified position RandomAccessFile rafTemp = null; //Ini Select a Random NonExistent File File userDirectory = new File(System.
12 2024-04-05
编程技术问答社区
如何使用Java 8 Stream映射和收集原始的返回类型
我是Java 8流中的新手,我想知道是否有执行forEach/map返回byte并接受int的方法. 示例: public class Test { private byte[] byteArray; // example of byte array public byte getByte(int index) { return this.byteArray[index]; } public byte[] getBytes(int... indexes) { return Stream.of(indexes) .map(this::getByte) // should return byte .collect(byte[]::new); // should return byte[] } } 您可能会猜到,getBytes方法不起作用. "int[] cannot
12 2024-04-05
编程技术问答社区
在Java 8中,是否有ByteStream类?
java 8分别提供Stream double,int和long:DoubleStream,IntStream和IntStream和LongStream的特殊性.但是,我在中找不到byte的等效物/a>. Java 8是否提供ByteStream类? 解决方案 不,它不存在.实际上,它明确未实现,以免为每种原始类型的大量类杂乱. 引用 简短答案:否. 这些形式不值得100k+ JDK足迹 几乎永远不会使用.如果我们添加了这些,有人会 要求简短,浮动或布尔值. 换句话说,如果人们坚持我们拥有所有原始的 专业,我们将没有原始的专业.哪个 将比现状更糟. 其他解决方案 大多数与字节相关的操作自动升级为INT.例如,让我们考虑一个简单的方法,该方法添加了byte常数byte[]数组返回新byte[]数组(ByteStream的潜在候选者): public static byte[] add(byte[] arr, byte addend)
12 2024-04-05
编程技术问答社区
为标签和标签区添加按钮 JavaFX
我正在搜索一种将按钮添加到Javafx Tab的方法. 搜索了互联网,但我找不到任何解决方案. 类似于下面的屏幕截图中的按钮. 有人可以帮我吗? 解决方案 在Tab s上具有图标Button: 之后,存在一个功能齐全的按钮,但是它不显示任何图标. Button还具有 setGraphic 可以使用相同的方法,因此可以添加ImageView以在Image上显示Image. . 在Tab-Area的右上角具有控制Button: 这些按钮可以放在TabPane 上,而不是TabPane内部.为此,您可以使用AnchorPane将Button s锚定在右上角. 示例: public class ButtonedTabPane extends Application { @Override public void start(Stage primaryStage) { BorderPane root = new
32 2024-04-05
编程技术问答社区
使用Java 8流的生成器模式
我正在构建一个简单循环的对象: WebTarget target = getClient().target(u); for (Entry queryParam : queryParams.entrySet()) { target = target.queryParam(queryParam.getKey(), queryParam.getValue()); } 我想使用Java8流API做同样的事情,但我不知道该怎么做.让我挣扎的是,目标每次都会重新分配,因此一个简单的.foreach()将不起作用.我想我需要使用.collect()或redail(),因为我正在寻找一个返回值,但目前我迷路了! 解决方案 不幸的是,流API中没有foldLeft方法.其原因由 stuart marks in 此答案: [...]最后,Java不提供foldLeft和foldRight操作,因为它们暗示了固有顺序的操作的特定顺序.这与上面指
24 2024-04-04
编程技术问答社区
如何在Java 8中实现构建器模式?
在Java 8之前实现构建器模式,有很多乏味的,几乎重复的代码;构建器本身通常是样板代码.一些重复代码检测器几乎将几乎每种pre-java 8构建器的方法视为其他所有方法的副本./p> 考虑以下Java Pre-Java 8构建器模式: public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } public
14 2024-04-04
编程技术问答社区
在LibGDX中使用Java 8
我使用libgdx在Java上写游戏,仅作为目标平台.我刚刚创建了一个新的libgdx项目,并将一些现有代码导入其中,但是现在我遇到了一些错误.具体而言,使用diamond operator.例如,这一行代码: HashMap connectionsMap = new HashMap(); 正在生成此错误: Error:(20, 37) java: diamond operator is not supported in -source 1.6 (use -source 7 or higher to enable diamond operator) 理想情况下,我想使用Java8.保留了我导入的模块中的gradle文件,因此我在整个项目中更改了所有其他build.gradle文件中的sourceCompatibility行,从1.6到1.8,并且我确保在Project Structure > Project > Language
4 2024-04-04
编程技术问答社区