首页 > 解决方案 > 如何在 intellij 中使用 scala.collection.JavaConverters?

问题描述

我想在scala中使用java nio,我尝试将此代码转换为scala:

ServerSocketChannel ssChannel = ServerSocketChannel.open();
int port = 9001;
ssChannel.bind(new InetSocketAddress(port));
Selector selector = Selector.open();

ssChannel.configureBlocking(false);
ssChannel.register(selector, SelectionKey.OP_ACCEPT); 

while (true) {
selector.select();
Set<SelectionKey> keys = selector.selectedKeys();
for (SelectionKey key : keys) {
  if (key.isAcceptable()) { 
    ServerSocketChannel ssc = (ServerSocketChannel) key
    .channel();
    SocketChannel sc = ssc.accept();
    sc.configureBlocking(false);
    sc.register(selector, SelectionKey.OP_READ); 
  }
  if(key.isReadable()){ 
    SocketChannel sc = (SocketChannel) key.channel();
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    sc.read(buffer);

    buffer.flip();
    sc.write(buffer);
  }
}
keys.clear();
}
}

当我将此代码复制到 intellij 时,intellij 询问我是否要将此代码转换为 scala,我同意。

然后是intellij

import scala.collection.JavaConversions._,

告诉我一个红色错误

我在 intellij 中使用 scala 2.12.7,我检查了 scala api 文档,JavaConversion 已弃用,所以我

import scala.collection.JavaConverters._

但是intellij告诉我它已被弃用,让我使用

scala.jdk.CollectionConverters

当我导入这个时,该行仍然有错误:

key.isAcceptable

那么如何在 intellij 中转换此代码?谢谢!

我的intellij版本是2018.3.4社区版

标签: scalaintellij-idea

解决方案


这是您的 Java 代码的非常简单的逐行翻译。

我不知道它是否符合您的要求,很长一段时间以来,我没有做过太多的 NIO,也没有涉足 Java 领域,但它确实可以编译。

import java.nio.channels.{ServerSocketChannel,Selector,SelectionKey,SocketChannel}
import java.net.InetSocketAddress
import java.nio.ByteBuffer
import collection.JavaConverters._

val ssChannel :ServerSocketChannel = ServerSocketChannel.open()
val port = 9001
ssChannel.bind(new InetSocketAddress(port))
val selector :Selector = Selector.open()

ssChannel.configureBlocking(false)
ssChannel.register(selector, SelectionKey.OP_ACCEPT)

while (true) {
  selector.select()
  val keys :collection.mutable.Set[SelectionKey] = selector.selectedKeys().asScala
  for (key <- keys) {
    if (key.isAcceptable()) {
      val ssc :ServerSocketChannel = key.channel().asInstanceOf[ServerSocketChannel]
      val sc :SocketChannel = ssc.accept()
      sc.configureBlocking(false)
      sc.register(selector, SelectionKey.OP_READ)
    }
    if(key.isReadable()){
      val sc :SocketChannel = key.channel().asInstanceOf[SocketChannel]
      val buffer :ByteBuffer = ByteBuffer.allocate(1024)
      sc.read(buffer)
      buffer.flip()
      sc.write(buffer)
    }
  }
  keys.clear()
}

您会注意到,在此示例中,JavaConverters它仅用于mutable.Set从 Java获取 Scala Set,并且仅用于使foreach()(内部理解)工作。


推荐阅读