Как использовать scala.collection.JavaConverters в Intellij?

Я хочу использовать 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.

Я загружаю новый intellij 2019.1.3, но intellij также говорит мне: «Не удается разрешить символ JavaConversions». Хорошо, я должен использовать netty.

wang kai 24.06.2019 05:01

Если вам удобнее работать с Java, вы также можете просто поместить .java исходные файлы в свой проект Scala, они также будут скомпилированы, и вы сможете вызывать их из кода Scala. Таким образом, вы можете постепенно мигрировать/переписывать.

Thilo 24.06.2019 09:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
901
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот довольно наивный, построчный перевод вашего 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() (внутреннее для понимания) работало.

Другие вопросы по теме