小编Ozi*_*ile的帖子

何时未分配的表达式是有效的语句?

我已经阅读了Oracle的表达式教程,无法理解这一点.

众所周知,以下代码行是有效的Java语法:

new Object();
Run Code Online (Sandbox Code Playgroud)

但是,当我用原始表达式尝试这个时:

(3 + 2);
Run Code Online (Sandbox Code Playgroud)

Eclipse显示编译错误"赋值的左侧必须是变量".

这不仅适用于原语,也适用于String文字:

"arbitraryString";
Run Code Online (Sandbox Code Playgroud)

那么,未分配的表达式作为Java代码行有效的规则是什么?

java

22
推荐指数
4
解决办法
811
查看次数

Java自动将集合转换为参数数组?

我知道Java"..."数组参数语法可以作为参数接收数组,或只传递给方法的许多参数.但是,我注意到它也适用于Collections:

public static void main(String[] args) {
    Collection<Object> objects = new ArrayList<>();
    test(objects);
}

public static void test (Object...objects) {
    System.out.println("no compile errors");
}
Run Code Online (Sandbox Code Playgroud)

这编译并运行,我无需调用该toArray()方法.现场背后发生了什么?此语法是否有其他"自动转换"方法?

顺便说一下,我正在使用Java 1.7.

java variadic-functions

11
推荐指数
1
解决办法
1737
查看次数

Spring Boot和Thymeleaf - 删除严格的HTML错误检查

我使用Spring Boot作为MVC应用程序,我的视图技术是Thymeleaf.我需要做的一件事就是复制现有网站的HTML(而不是我做的......)并使用Thymeleaf渲染它.然而,一些网站的HTML源代码的包含未闭合的HTML标签(例如<meta>,<link>,<input>),或者未用引号括起来的元素,例如HTML标签:

<div id=1></div>
Run Code Online (Sandbox Code Playgroud)

代替

<div id="1"></div>
Run Code Online (Sandbox Code Playgroud)

当然在浏览器中这可以工作......但是Thymeleaf不允许这样做,也不会为页面提供服务.有没有办法让这个更宽松的规则?我搜索了Thymeleaf的文档和Spring Boot参考,但没有找到答案.

只是为了澄清 - 我甚至没有为Thyemeleaf配置我自己的bean,只是通过maven作为spring-boot-starters之一将它添加到类路径中.所以现在这些都是默认设置.

html java spring spring-mvc thymeleaf

9
推荐指数
3
解决办法
8835
查看次数

Spring Data JPA - 模拟现有集合的“创建 + 连接”查询

假设我有一个实体列表:

List<SomeEntity> myEntities = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

SomeEntity.java:

@Entity
@Table(name = "entity_table")
public class SomeEntity{

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private int score;

public SomeEntity() {}

public SomeEntity(long id, int score) {
    this.id = id;
    this.score = score;
}
Run Code Online (Sandbox Code Playgroud)

MyEntityRepository.java:

@Repository
public interface MyEntityRepository extends JpaRepository<SomeEntity, Long> {

List<SomeEntity> findAllByScoreGreaterThan(int Score);
}
Run Code Online (Sandbox Code Playgroud)

所以当我运行时:

myEntityRepository.findAllByScoreGreaterThan(10);
Run Code Online (Sandbox Code Playgroud)

然后 Hibernate 会将表中的所有记录加载到我的内存中。有数百万条记录,所以我不想那样做。然后,为了相交,我需要将结果集中的每条记录与我的列表进行比较。在本机 MySQL 中,我在这种情况下会做的是:

  1. 创建一个临时表并将列表中的实体 ID 插入其中。
  2. 将这个临时表与“entity_table”连接起来,使用分数过滤器,然后只提取与我相关的实体(首先出现在列表中的实体)。

通过这种方式,我获得了很大的性能提升,避免了任何 OutOfMemoryErrors 并让数据库机器完成大部分工作。

有没有办法使用 Spring Data JPA 的查询方法(使用 hibernate 作为 JPA 提供程序)来实现这样的结果?我在文档或 SO 中找不到任何此类用例。

java hibernate jpa spring-data spring-data-jpa

5
推荐指数
1
解决办法
3436
查看次数

Kotlin - 提取变量快捷方式后在 IntelliJ 中明确指定类型

在 Intellij 中用 Java(和 Kotlin!)编码时,我通常从它们被分配的表达式中提取变量/字段。换句话说,如果我想在 Kotlin 中编写以下代码:

val 名称 = getMyString()

然后我会写getMyString,突出显示它并使用键盘快捷键提取变量。好看又简单。

但是假设我希望明确显示值类型,意思是:

val 名称:String = getMyString()

如果我使用变量提取,IntelliJ 会为我提供一个复选框,我必须用鼠标点击它,它会显示类型。另一个烦人的选择是设置变量名称,然后使用 Alt + Enter 显式显示类型。

与之前的问题(或 JetBrains 文档)不同,我希望默认显示类型。我只是想知道是否有键盘快捷键可以检查上述复选框,而不会中断编写代码的流程。

intellij-idea kotlin

5
推荐指数
1
解决办法
817
查看次数

Spring Boot如何在子类的方法上识别@Scheduled?

让我们举一个简单的Spring Boot程序的例子:

Application.java

@SpringBootApplication
@EnableScheduling
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

SuperClass.java

public abstract class SuperClass {

    @Scheduled(fixedRate = 5000)
    public void printSomething() {
        System.out.println("this is the super method");
    }
}
Run Code Online (Sandbox Code Playgroud)

SubClass.java

@Component
public class SubClass extends SuperClass {

}
Run Code Online (Sandbox Code Playgroud)

根据这个答案,只有注释的注释由@Inherited子类继承,而@Scheduled没有这样的注释.那怎么会有效呢?

java spring spring-boot

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

Spring Boot集成使用包含swing内容的config类测试HeadlessException

我知道当弹出组件弹出时,Spring Boot在加载上下文时遇到问题.我在这里读到如何成功加载上下文.但是,集成测试怎么样?

MyApplicationTests.java

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MyApplication.class)
public class DemoApplicationTests {

@Test
public void contextLoads() {
}
}
Run Code Online (Sandbox Code Playgroud)

MyApplication.java

public static void main(String[] args) {
    try(ConfigurableApplicationContext context = new SpringApplicationBuilder
            (DesktopAppConfig.class)
            .headless(false).run(args)) {
    }
Run Code Online (Sandbox Code Playgroud)

DesktopAppConfig.java

@Configuration
public class DesktopAppConfig {

@Bean
public Object someBean() {
        JOptionPane.showMessageDialog(null, "message");
    return new Object();
    }
}
Run Code Online (Sandbox Code Playgroud)

这个简单的集成测试会抛出一个java.awt.HeadlessException,我无法在Spring Boot引用中找到任何通过集成测试将上下文设置为无头的方法.

java spring spring-boot

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

Kotlin - 只读取文件中的前n行

是否有一种方法,不解决传统的类似Java的for循环,限制BufferedReader读取的行数?

以此代码为例:

bufferedReader.useLines { it }
            .take(10)
            .toList()
Run Code Online (Sandbox Code Playgroud)

useLines各州的文件:

调用[block]回调,为它提供此文件中所有行的序列,并在处理完成后关闭阅读器一次.

根据我的理解,这意味着将读取整个文件,然后才会从序列中过滤掉前十个文件.除了只获取第一行之外,我无法在网上找到解决此问题的任何内容.

kotlin

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