Я хочу использовать java nio в scala, я пытаюсь преобразовать этот код в 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, я согласен.
затем разум
import scala.collection.JavaConversions._,
и скажи мне красную ошибку
Я использую scala 2.12.7 в intellij, я проверяю документ scala api, JavaConversion устарел, поэтому я
import scala.collection.JavaConverters._
но intellij говорит мне, что это устарело, позвольте мне использовать
scala.jdk.CollectionConverters
когда я импортирую это, в строке все еще есть ошибка:
key.isAcceptable
так как преобразовать этот код в intellij?Спасибо!
Моя версия Intellij - 2018.3.4 Community Edition.
Если вам удобнее работать с Java, вы также можете просто поместить .java
исходные файлы в свой проект Scala, они также будут скомпилированы, и вы сможете вызывать их из кода Scala. Таким образом, вы можете постепенно мигрировать/переписывать.
Вот довольно наивный, построчный перевод вашего 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
используется только для получения Scala mutable.Set
из Java Set
, и это необходимо только для того, чтобы foreach()
(внутреннее для понимания) работало.
Я загружаю новый intellij 2019.1.3, но intellij также говорит мне: «Не удается разрешить символ JavaConversions». Хорошо, я должен использовать netty.