我写了以下代码:
val src = (0 until 1000000).toList()
val dest = ArrayList<Double>(src.size / 2 + 1)
for (i in src)
{
if (i % 2 == 0) dest.add(Math.sqrt(i.toDouble()))
}
Run Code Online (Sandbox Code Playgroud)
IntellJ(在我的例子中是AndroidStudio)问我是否要用stdlib中的操作替换for循环.这导致以下代码:
val src = (0 until 1000000).toList()
val dest = ArrayList<Double>(src.size / 2 + 1)
src.filter { it % 2 == 0 }
.mapTo(dest) { Math.sqrt(it.toDouble()) }
Run Code Online (Sandbox Code Playgroud)
现在我必须说,我喜欢改变的代码.当我提出类似的情况时,我发现写入比循环更容易.但是在阅读了filter函数的功能后,我意识到与for循环相比,这是一个很慢的代码.filterfunction创建一个新列表,其中仅包含src中与谓词匹配的元素.因此,在stdlib版本的代码中创建了另外一个列表和一个循环.对于小型列表来说,它可能并不重要,但总的来说这听起来不是一个好的选择.特别是如果要连接更多这样的方法,你可以通过编写for循环来获得许多可以避免的额外循环.
我的问题是什么被认为是Kotlin的良好做法.我应该坚持使用循环还是我错过了一些东西而且它不起作用,因为我觉得它有效.
我有一个接受Class参数的Java方法.我需要传递Integer.class给它,但是来自Kotlin代码.我试过Int::class.java,但这不起作用,因为int.class传递给函数.我的问题是,我如何Integer.class从Kotlin 访问.
Java的
void foo(Class clazz);
Run Code Online (Sandbox Code Playgroud)
科特林
foo(Int::class.java) // does not work, int.class gets passed to foo
Run Code Online (Sandbox Code Playgroud) 我有以下代码:
struct Foo
{
struct Bar
{
std::uint32_t x = -1;
constexpr Bar(std::uint32_t x) : x(x) {}
};
static constexpr Bar CONST_BAR = Bar(0);
};
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,出现以下错误:
错误:'constexpr Foo::Bar::Bar(uint32_t)' 在定义完成之前在常量表达式中调用
有人可以向我解释发生了什么吗?据我所知,Bar 的构造函数是在第一次调用之前定义的。
是否有可能在C++中有这样的东西:
struct Foo
{
int x;
constexpr Foo(int x) : x(x) {}
static constexpr Foo table[] =
{
Foo(0),
Foo(1),
Foo(2),
};
};
Run Code Online (Sandbox Code Playgroud)
我尝试了几种组合,但都没有效果.如果table不是Foo类的一部分,它可以工作,但我真的希望它成为Foo命名空间的一部分.
编辑:
我想要这个的原因是我可以访问表格Foo::table.我在命名空间中有几个这样的类,如果我可以通过编写导入我正在使用的类using someNamespace::Foo然后访问该表,这非常方便Foo::table.如果表在课外,我必须始终通过写作来访问它someNamespace::fooTable.
我有以下代码:
#include <iostream>
#include <string>
using std::cout;
using std::endl;
void bar(const std::string& str)
{
cout << "const str - " << str << endl;
}
void bar(std::string&& str)
{
cout << "str - " << str << endl;
}
void foo(std::string&& str)
{
bar(str);
}
int main()
{
foo("Hello World");
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,void bar(const std::string& str)调用了重载.如果我想要bar(std::string&& str)调用void 重载,我要么必须写bar(std::move(str));或bar(std::forward<std::string>(str));
显然,前向代码更长,但对我来说更有意义.我的问题是什么是更常用和更喜欢的.写作bar(std::forward(str));将是最好的解决方案imo,但这不是一个选项:)
我最近在c ++中发现了RAII,大多数RAII的例子都谈到了异常安全问题.即使抛出异常,如何始终释放资源.
我的问题是,如果你没有开启例外,如果RAII是值得的.在我们公司,我们致力于嵌入式项目的手臂和异常被默认关闭,我们并没有真正看到它们的需要.
感谢所有的答案!
我有一个使用导航组件切换的Activity多个应用程序Fragments.当我在两个片段之间切换时,它们onCreate()和onDestroy()方法似乎重叠.因此,当我们访问相同的全局对象时,我很难为片段编写初始化和清理代码.
导航Framgent_A到Fragment_B具有以下方法顺序:
Fragment_B.onCreate()
Fragment_A.onDestroy()
Run Code Online (Sandbox Code Playgroud)
在Fragment_A.onDestroy()我逆转我做的操作Fragment_A.onCreate().而且Fragment_B我希望事情在onCreate()被召唤时处于中立状态.然而事实并非如此,因为Fragment_A.onDestroy()尚未召集.
Android上的重叠是否正常,或者我的导航组件中是否配置了错误?还有另一种方法可以实现我想做的事情吗?我知道我可以将两者结合起来Fragments并使其发挥作用,但我不想让Fragment彼此了解.对我而言,Framgnet_A在Fragment_B创建时,仍然存在时似乎很奇怪,何时Fragment_B应该替换Fragment_A.
任何帮助是极大的赞赏!
编辑:
在调试源代码之后,我发现在FragmentNavigator.navigate() FragmentTransaction.setReorderingAllowed()中调用了它,它允许重新排序操作,甚至允许在前一个之前onCreate()调用一个新的片段onDestroy().问题仍然存在,如何在下一个片段中初始化相同的全局状态之前解决我在一个片段中正确清理全局状态的问题.
android fragment-lifecycle android-architecture-components android-jetpack android-architecture-navigation
我有一个活动应用程序。在应用程序的一个部分中,有一个 Fragment 的主从组合,这些 Fragment 使用共享的 ViewModel在它们之间共享一些数据。我面临的问题是,即使两个 Fragment 都已被销毁,也不会调用 ViewModel 的 onCleared() 方法。onCleared() 仅在活动被销毁时调用。
这是它应该如何工作?因为这在单个 Activity 模型中非常无用,因为 Activity 始终处于活动状态。或者我错过了什么?
我只能访问C++ 03,而且我经常想要将一个向量移动到一个函数中,就像在C++ 11中一样.如何做的问题不要过多地混淆代码的用户.所以我的问题是程序员在C++ 11之前是如何做到的.
我知道可以使用交换功能"移动"向量.所以这就是我提出的:
class Foo
{
public:
Foo(std::vector<int>& vec)
{
using std::swap;
swap(vec, m_vec); // "move" vec into member vector
}
private:
std::vector<int> m_vec;
};
// usage:
std::vector<int> v(100, 1337);
Foo foo(v);
// v.empty() == true
Run Code Online (Sandbox Code Playgroud)
这种方法的问题在于,用户不明白他们的矢量将被移动到类Foo中.有这种问题的最佳实践解决方案吗?提前致谢!
在下面的代码中我希望equals()返回true,但事实并非如此.我在这里错过了什么?
SparseBooleanArray array_0 = new SparseBooleanArray();
array_0.put(0, true);
array_0.put(2, true);
SparseBooleanArray array_1 = new SparseBooleanArray();
array_1.put(0, true);
array_1.put(2, true);
boolean isEqual = array_0.equals(array_1); // is false instead of true
Run Code Online (Sandbox Code Playgroud)
在调试器中查看两个数组,它们对我来说似乎是一样的(它们有不同的shadow$_monitor_值,但我不知道应该是什么).该toString()方法也为两者返回相同的字符串.
我想写的一种转换功能单元测试EnumSet的SparseBooleanArray,但我不能手动创建同一阵列将其与函数的返回值进行比较.
编辑
我还应该提一下hasCode(),根据文档,也不应该返回不同的值.